C++中的拷贝构造函数和拷贝赋值操作符+const成员变量初始化(5)---《Effective C++》
来源:互联网 发布:手机淘宝信誉评价在哪 编辑:程序博客网 时间:2024/05/21 22:50
C++中拷贝构造函数和拷贝赋值操作符,
C++中编译器可以自动生成copy 构造函数,copy operator=,析构器等函数,那么什么时候编译器无法自动生成copy 构造函数和copy operator=呢?
那么就是以下这两种情况啦:
1)引用成员变量
2)const成员变量
参看以下代码:
#include <iostream>#include <cstring>#include <string>using namespace std;class Hello{public: //注意初始化方式,const成员变量和引用成员变量需要采用参数成员赋值,不能在内部赋值 Hello(string s) :i(20),s(s){ } void show(){ cout << s <<" "<<i<< endl; }private: string& s; const int i;};int main(){ Hello hel("world"); return 0;}
这样的话,编译器就无法生成copy构造函数和copy operator=,自己也无法生成这两个函数。
PS:如何将拷贝构造函数和拷贝赋值操作符加以区分呢?即C++什么时候调用函数的copy构造函数,什么时候调用copy operator=呢?有一个规律是在C++对象第一次出现的时候调用copy 构造函数,第二次进行赋值的时候调用copy operator=,Hello h1(h)或者Hello h2=h,此时是copy 构造函数;如果是Hello h2,h2=h,此时调用的是copy operator=操作符,具体大家可以参考:
#include <iostream>#include <cstring>#include <string>using namespace std;class Hello{public: Hello(){ } Hello(string s):i(20),s(s){ this->s = s; } Hello(Hello &s){ this->i = s.i; this->s = s.s; } Hello& operator=(Hello& s){ this->i = s.i; this->s = s.s; cout << "hello,发现问题在哪儿了吗!!!" << endl; return *this; } void show(){ cout << s <<" "<<i<< endl; }private: string s; int i;};int main(){ Hello hel("world"); Hello hel1; hel1 = hel; return 0;}
PS:
C++中const成员变量的初始化方式:
1)通过在构造函数中,通过参数初始化列表的方式初始化;
class A{public: A(); A(int y):x(100){ this->y=y; }private: const int x; int y;};
2)通过将const成员变量声明为static,然后加以初始化。
class A{public: A(int y){ this->y=y; }private: const static int x; int y;};const int A::x=10;
阅读全文
0 0
- C++中的拷贝构造函数和拷贝赋值操作符+const成员变量初始化(5)---《Effective C++》
- 【C++】拷贝构造函数和赋值函数
- 【C++】拷贝构造函数和赋值符函数
- C++中的拷贝构造函数和赋值操作符
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- 拷贝构造函数和赋值操作符
- Effective C++ 学习笔记:为含指针变量的类声明一个拷贝构造函数和一个赋值操作符
- Effective C++ 学习笔记:为含指针变量的类声明一个拷贝构造函数和一个赋值操作符
- [C++]拷贝构造函数和赋值运算符重载
- C++拷贝构造函数和拷贝/赋值操作符
- tensorflow_win安装
- 畅通工程
- Linux初体验
- JDK开发环境搭建及环境变量配置详细教程
- Ubuntu14.04下gcc/g++版本切换
- C++中的拷贝构造函数和拷贝赋值操作符+const成员变量初始化(5)---《Effective C++》
- poj1743 Musical Theme(后缀数组+二分答案)
- 使用OpenSSL自建CA及颁发证书、吊销证书
- PythonNewHere -- 字符串与字典类型互相转换的方法
- 福州大学第十四届程序设计竞赛训练总结【7/9】
- Redis操作指令一
- MATLAB:insertShape对图像具体位置进行标记
- CodeForces An express train to reveries(简单的模拟)
- OpenGL 按照三角形仿射变换并贴图渲染(正常渲染或离屏渲染以及异步优化)(一)