首页 > C/C++ > 侯捷-C++面向对象程序设计-学习笔记-04-常量成员函数-参数传递与返回值

侯捷-C++面向对象程序设计-学习笔记-04-常量成员函数-参数传递与返回值

2020年8月11日
分类: C/C++ 标签: ,

1,c++类中的常量(const)成员函数

类似下边这种在函数圆括号之后附加const关键词的函数,称为常量成员函数。

class A{
    public:
        void fun() const {}
};

其作用是,确保类的成员变量不被修改。

我们可以使用普通的类对象来调用const成员函数,也可以使用const类对象来调用const成员函数。

A a;
const A c;

a.fun();
c.fun();

然而,const类对象只能调用const成员函数。这点由编译器来保证,如果使用不当,编译器会报错。

如果成员函数不改变类中的数据,则应该将其定义为常量成员函数。

2,参数传递方式

  • 传值(pass by value)
    • void foo(A a);
    • 将实参原原本本地复制一份给形参
    • 如果实参size较大,效率会很低
  • 传引用(pass by reference)
    • void bar(A& a);
    • 通过形参直接访问实参,效率高。建议所有的参数都以引用的方式传递。
    • 如果不希望函数改变实参,可以传递const类型的引用:void bar2(const A& a);
    • 【这里,侯捷老师提到,引用在底层也是通过指针实现的,之前没有深究过。这还是比较容易理解的,c++是基于c实现的,c中最高效的数据传递方式就是指针了,用指针来实现引用可以说一脉相承。那为什么有了指针,还需要单独设计引用呢?显然这是为了规避指针在使用环节上的缺点(空指针、野指针、内存泄露等),提高语言的易用性。关于指针和引用的异同,可以参考这里。】

3,函数返回值方式

  • 返回对象的值(return by value)
  • 返回对象的引用(return by reference)
    • 这也是为了提高效率,避免对象复制操作
    • 但是需要注意:不要返回局部变量的引用!局部变量在函数返回后会被销毁,其引用也就没有意义了。
    • 【这里的引用指左值引用,c++11中增加了右值引用,是可以返回局部变量的右值引用的。这里不深究。】

4,c++类的友元函数

  • 类中通过friend声明的一个外部定义的函数,可以直接访问类的private成员变量
  • 打破了类的封装性
  • 同一类的对象互为友元。
    • class A{
          public:
              int func(const A&amp; a){return <span style="color: #0000ff;">a.i</span>;}
      
          private:
              int i;
      };
      
      A a,b;
      a.func(b);
    • 【对于这一点,是不是也可以从作用域的角度来理解】

 

————————-笔记分割线——————–

【侯捷老师推荐的书籍】

您可能需要这些【参考资料】:
零一积流|IT参考 原创文章,转载请注明出处: http://www.it-refer.com/2020/08/11/houjie-cplusplus-object-oriented-programming-04-const-member-function-and-parameter-passing-by-value-or-reference


本文的评论功能被关闭了.