2020-08-30-C/C++编程思想

Record

Posted by Jocelyn on August 30, 2020

2020-08-30-recording.

  • 拷贝构造函数:是特殊的构造函数,编译器使用拷贝构造函数 通过 值传递 方式 在函数中 传递和返回对象

引用

  • const int& q = 12;
    编译器会分配存储单元,它的值被初始化为 12。所以 引用  这个存储单元 联系起来。
    应用要点:任何引用 必须和 存储单元 联系,访问引用 就是在 访问存储单元
    
  • 不可能有NULL的引用,必须确保有 合法的 存储单元 与之 相关联

  • 指针引用:想要改变指针本身,而不是指向的内容

    void increment(int* &i){i++;}
    void increment1(int &*i){i++;}
    可以从标识符开始,向左向右看,第二个中 没有什么类型是 int&  
    法则是:先右再左
    
  • 传值方式 传递参数,需要调用 构造函数 析构函数

  • 常量引用传递参数,仅需要将地址压栈

ostream允许 对齐方式 和 输出宽度

cout.setf(ios::right,ios::adjustfield);
cout.width(100);
需要对每行都进行设置

拷贝构造

  • 拷贝构造函数的实现 是 值传递的方式 进行 参数传递 和 返回

  • 编译器创建的 默认构造函数 都是 位拷贝,当面临较复杂情况时,位拷贝会有问题

  • 如果没有创建 拷贝构造函数,编译器会自动创建,但是是 位拷贝的

  • 如果自己定义了 拷贝构造,编译器就不再创建默认的 拷贝构造

  • 递归调用拷贝构造

    class WithCC{
    public:
      WithCC(){}
      WithCC(const WithCC &){
          
      }
    };
      
    class WithOutCC{
      string id;
    public:
      WithOutCC(const string& ident = ""):id(ident){}
    };
      
    class Composite{没有显示定义 拷贝构造函数
      WithCC withcc;
      WithOutCC withoutcc;
    public:
      Composite():withoutcc("Composite()"){}
    };
      
    int main()
    {
      Composite c;
      Composite c2 = c;会使用拷贝构造函数创建对象
    }
    编译器会 递归地 为所有成员对象  基类 调用拷贝构造函数,如果它们没有,编译器会创建,但该 拷贝构造 是位拷贝
    
  • 防止按值传递

    声明 私有 拷贝构造,不必实现

#