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,就像之前所述的那样,当子类赋值或者拷贝时就会发生链接错误


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 战地一要我升级显卡驱动怎么办 刺客信条兄弟会存档损坏了怎么办 电脑上所有软件和文件被删了怎么办 电脑显示文件已打开无法删除怎么办 金立手机桌面停止运行黑屏怎么办 苹果平板电脑玩游戏黑屏闪退怎么办 电脑开机时显示无法找到入口怎么办 我的世界显示网络玩不了的怎么办啊 网页被设置成不可以到下一页怎么办 小天鹅热水器排污螺丝拧不动怎么办 葡萄霜霉严重叶片开始发焦了怎么办 上海高架gps定位信号差怎么办 老公开车技术不行还非要开怎么办 我偷了同学手机被发现应该怎么办 没满月孩孑4天没大便了怎么办 电机轴总是从皮带轮处断裂怎么办 天花板吊顶里的热水管经常坏怎么办 摩托车油箱下面的废油管漏油怎么办 大修机械压力机轴取不下来怎么办 萌侠传说账号密码没了怎么办 车子前保护杠塑料刮花了怎么办 糖猫电话手表关机了找不到了怎么办 小天才电话手表被洗衣机洗了怎么办 小天才电话手表放洗衣机洗了怎么办 小天才电话手表泡水了怎么办 小天才电话手表联不上网怎么办 肺炎用激素治疗后肚子大了怎么办 8岁以下儿童总是低烧不退怎么办? 微博里面的视频不能改变方向怎么办 朗逸导航倒车一体机死机了怎么办 乐淘乐电话手表的二维码没了怎么办 艾蔻儿童手表二维码丢了怎么办 糖猫儿童智能手表二维码丢了怎么办 海信电视用遥控器关了打不开怎么办 创维4k电视遥控器按键坏了怎么办 大疆3s云台陀螺仪错误怎么办 无线路由我用手机上网网速慢怎么办 下载的软件安装包以丢失怎么办 战舰世界航母的飞机恐惧状态怎么办 cad打开图纸不显示轴号怎么办 若背包忘在服务区没拿怎么办