1、 C++中引用的3大特性
a) 创建时必须要被初始化
b) 一旦创建后指向一个对象即不能指向别的对象
c) 不可能有NULL的引用。必须要确保引用是和一块合法的存储单元关联。
可以把引用看做一个是语法更加便利的工具。
2、 函数中的引用
a) 常量的引用:将函数的参数定义为常量时,在函数中就不会对参数改变。这样无论什么时候调用该函数都是合适的。
b) 参数传递规则:函数传递时一般用常量引用来传递。当传值是唯一安全途径时可以考虑用传值的方式。否则使用常量引用来传递。
3、 C++中的拷贝构造函数
a) 位拷贝和值拷贝
位拷贝,拷贝的为地址,如果将对象的标识符当做一个指针,则位拷贝可以认为将一个对象标识符所指向的存储单元的地址赋值给另一个存储对象的标识符。这样两个标识符指向同一位置。这样会出现被赋值的标识符原来的存储空间并未释放的问题(存储泄露),同时,对任何一个对象的操作都会影响到另外一个。
值拷贝,拷贝的为值。所以,虽然,两个标识符所指向的存储单元中的内容相同,但两个存储单元却不同。
所以,如果用位拷贝实现类的对象的返回时就会出现如上所述的问题。这样就催生了拷贝构造函数。
b) 函数调用时栈的分布如下:
函数参数 |
返回地址 |
局部变量 |
其中,为了能返回C++中的对象,函数的参数包括了用以存储返回对象的地址。返回地
址,为函数调用结束后用以返回调用函数的地址。局部变量存放被调用函数中的临时变量。
c) 拷贝构造函数,会在用一个已存在的对象来创建一个新的对象时使用,如:将某
个对象传入函数、从函数中返回对象以及用一个对象来初始化产生另一个对象。当我们自己没有定义拷贝构造函数时,编译器将会自动的为我们创建一个位拷贝的构造函数。所以,如果要想程序在自己的控制下,最好定义自己的拷贝构造函数。为了对使用组合以及继承的类创建拷贝构造函数,编译器会递归的为所有的成员对象和基类调用拷贝构造函数。
d) 为了防止我们使用编译器为我们提供的位拷贝构造函数而使程序出现莫名其妙的
错误,我们可以防止使用桉值传递,不适用桉值传递当然就不会存在拷贝构造函数的调用。而,具体的防止误用拷贝构造函数的办法为,在类中申明一个私有的拷贝构造函数,这样编译器就不会为我们自动生成拷贝构造函数。这样如果客户程序员一旦在程序中使用了拷贝构造函数,编译器将报错。
4、 成员指针
C++中成员指针所存放的并不是具体的地址,而是,类的成员在类中的偏移。只有把这
偏移值和具体某一个对象的开始地址组合一起使用时才能得到实际地址,即要求选择一个对象的同时间接引用成员指针。定义如下:
Int ObjectClass::*pointerToMember=&ObjectClass::a;
定义了一个指向类ObjectClass中成员变量a的指针。Int OjectClass指明了成员指针可以指向ObjectClass中的任何一个类型为int的成员变量。
以下为类的对象的指针和类的对象对于指针的使用:
ObjectPoint->*PointerToMember=47;
Object.*PointerToMember=47
5、 成员函数指针
同成员变量一样可以用如下类似函数指针的方法定义成员函数指针:
Int (Classname::*fp)(float)=&Classname::fun;
其中int为函数的返回值的类型,(float)为函数的参数列表。如上也可以给出不含参数的
函数,编译器允许成员函数指针类型实现重载。使用时也是要同某一个对象进行绑定才能使用。
本文为个人学习C++编程思想时个人心得体会,所以,难免有不严谨之处,甚至有可能是错误的理解。如发现错误,或者疑问。欢迎提出讨论,共同学习、进步。