C++类的学习笔记

1、关于类的初始化

          如果类中设置了成员变量,那么你就必须对每一个成员变量都配备类内初始化,或者在构造函数中进行初始化。如果你没有这样做,那么编译器会为这些成员变量指定默认值,但这个默认值可能并不和你心意,因为它可能会使结构体的某些域未被初始化,或者初始化成一个你不满意的值;

        当new一个新的类对象时,如果不传入任何参数,则会调用默认的构造函数;

        类成员变量的初始化不是按照初始化表的顺序被初始化的,而是按照在类中声明的顺序被初始化的;

        当一个类的成员变量需要以相同的方式在不同的构造函数中初始化的话,那么请使用类内成员初始化;

        以上内容参考http://roclinux.cn/?p=3493

                                 http://www.cppblog.com/xczhang/archive/2008/01/22/41613.html

         如果你针对类中的某个成员变量没有使用类内成员初始化,且这个类也没有其他构造函数,那么你就须要定义默认构造函数,以确保类对象处于一个可用的状态。这样规定的原因在于,如果你既没有进行类内成员初始化,也没有定义默认构造函数,那么编译器会为这个类成员变量设置一个默认的值,但这个值可能并非合理的值,或许会导致一些错误发生。

2、关于const 引用(主要是函数的参数传递)

       最近项目中涉及到的函数参数传递二维vector,而且数据量很大,因此为了效率方面的考虑使用了const 引用,下面时在网上找的一些知识点。

         C++传递对象的时候默认是传值的(pass-by-value),而这样的传递自然是昂贵的:这当中包含了临时对象的构造/析构,以及临时对象中的对象的构造/析构,运气背点还可能有对象中的对象中的对象的构造/析构。

       相对于传“值”,一个更好的替代方法是传“const引用”(pass-by-reference-to-const)。传值与传指针的一个区别是,通过传值传递的对象并不是原来的对象,而是一个复制品,所以随便你打它骂它,真身都不会受到影响。而通过传指针的对象和原来的对象就是同一家伙,改动一个另外一个也受到相同的影响。而这有时候并不是我们想要的结果。

考虑到传值代价太高,传“const引用”就成了一个很好的替代品。传“const引用”的另外一个好处在于避免了“剥皮问题”(slicing problem,侯捷大师的版本是“对象切割问题”)

            用传值方式传参的函数,如果某参数的类型是一个父类对象,而实际传递的参数是一个子类对象,只有该对象的父类部分会被构造并传递到函数中,子类部分的成员,作为父类对象的“皮”,就被血淋淋的剥掉了……
而如果用传“const引用”方式,就没有这种惨无人道的状况:本来父类的指针就可以用来指向一个子类对象,天经地义。
但凡有规矩就有例外,对于内置类型(bulit-in type)对象以及STL中的迭代器、函数对象,Scott还是建议使用传值方式传递,原因是他们本来就是被设计成适合传值传递的。如果你认为上面两种情况可以用传值传递是因为它们,比如说内置类型对象,的大小本来就小,进而得出小数据类型就可以用传值传递,就打错特错了。原因见第一段:小对象的构造/析构过程完全可能很恐怖。

           再退一步,哪怕某个类型很小,它的构造/析构函数也简单到可以忽略不计,我们还是不能以此断定可以用传值传递这种类型的对象:因为编译器往往会做出一些蠢事。书中的一个例子是,对于一些编译器可以接受把一个double类型对象存入寄存器,但是如果你给它一个只有一个double成员的对象交给它,它却拒绝将该对象存入寄存器。(什么事让编译器插一手,不是问题也有了问题……)
最后还有个理由,虽然某对象现在很小,可是随着社会的发展人类的进步,有可能两年后它就会变成一个庞然大物,到时候用传值也会变得不合适。

           因此,还是老实点:除了内置类型和STL的迭代器、函数对象外,其他的对象传递时,用传“const引用”代替传值吧。

         上面知识参考http://www.cppblog.com/note-of-justin/archive/2010/01/04/103378.aspx


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值