Effective c++笔记(三)
来源:互联网 发布:淘宝客怎么使用 编辑:程序博客网 时间:2024/05/24 06:18
条款6:
C++默默会为类创建default构造函数、copy构造函数、copy assignment函数和析构函数。
条款7:
如果不需要编译器为其自动生成的函数应该显式拒绝
在编译器中如果没有创建default构造函数、copy构造函数、copy assignment函数和析构函数,编译器会为类创建一个,类型为public inline形式的。如果我们定义了构造函数,那么编译器的自动生成defalut构造函数行为就会消失,其他同理。
这里重点讲一下copy构造函数和copy assignment函数:
#include<iostream>#include<cstring>using namespace std;template<typename T>class type1{ private: string nameValue; T object; public: type1(const char* name,const T& value); type1(const string& name,const T& value); void print() { cout<<nameValue<<" "<<object<<endl; } };template<typename T>type1<T>::type1(const char* name,const T& value):nameValue(name),object(value){ cout<<"const char parameter function is called"<<endl; }template<typename T>type1<T>::type1(const string& name,const T& value):nameValue(name),object(value){ cout<<"string parameter function is called."<<endl; }int main(){ type1<int>obj1("const char* of zhangxin",2); string on("string of zhangxin"); type1<int>obj2(on,3); type1<int>obj3(obj1); obj1.print(); obj2.print(); obj3.print(); system("pause"); return 0;}
如下为程序运行结果(DEV C++):
如上当调用type<int>obj3(obj1)时编译器就会调用为他制作的copy构造函数。实际上在obj2构造过程中同样有copy构造函数,此时是string类型的拷贝构造函数会被调用。
但是注意当成员数据是引用或者const类型时,赋值运算符需要重载,否则会出现编译器错误。
#include<iostream>using namespace std;template<typename T>class type1{ public: type1(string& name,const T& value):nameValue(name),objectValue(value) { } //... void print() { cout<<nameValue<<" "<<objectValue<<endl; } private: string& nameValue; const T objectValue; };int main(){ string newDog("hi,zhangxin"); string oldDog("ki,zhangxin"); type1<int>p(newDog,2); type1<int>q(oldDog,36); p.print(); q.print(); p=q; system("pause"); return 0;}
如上代码中p=q这个是无法执行的,因为在此之前的p中的nameValue已经初始化为"hi,zhangxin",p=q意味着改变引用对象,这显然是不合法的。最后一种情况:当存在继承关系中且父类将copy assignment声明为private时,derived class此时无法生成copy assignment,因为无法处理base class的部分
条款7很容易理解,当我们不允许拷贝和赋值时就应该拒绝它,换句话说我希望我的类对象永远是独一无二的。解决方案是:
第一种方式将copy assignment和copy构造函数声明为private,并且只声明不定义(这是为了防止友元函数或者成员函数进行有意义的调用)
第二种方式设置一个父类,父类中的拷贝构造函数和赋值运算符都设置为private,就像之前所述的那样,当子类赋值或者拷贝时就会发生链接错误
- 《Effective C++》学习笔记(三)
- 《effective c++》学习笔记(三)
- Effective C++(三)资源管理
- effective C++(三)
- 《effective C++》条款三
- <<Effective C++>>读书笔记(三)
- 《Effective C++》(三)
- reading《effective c++》三
- Effective c++笔记(三)
- 《Effective C++》 笔记
- 《Effective C++》阅读笔记
- Effective C++--笔记
- <Effective C++: 资源管理> 笔记
- <<Effective C++>>笔记1
- <<Effective C++>>笔记3
- <<Effective C++>>笔记4
- <<Effective C++>>笔记5
- 《Effective C++》学习笔记
- ubuntu 12.04 LTS 内核为3.2 忘记密码
- 快速排序
- 上拉电阻的作用详解
- 反射--Field
- spring+springmvc+druid+oscache+mybatis整合web.xml 配置内容
- Effective c++笔记(三)
- S3C2440中断学习
- CSRF Security Error解决办法
- iPhone开发之深入浅出 (1) — ARC是什么
- ucos 事件及事件控制块
- sqlserver 数据库 SQL循环语句
- 怎么在Release模式下调试代码
- Visual Studio 下开发无法引用App_Code 里的类
- 系统用户管理