摘要:1.公有继承public 要保持IS --A的关系 也就是说,派生类继承基类,每一个基类对象同时也是一个派生类对象,但是每一个派生类对象不一定是基类对象。 大包含小的意思,基类的范围要比派生类的小 2.避免遮掩继承而来的名称。 如果基类中用到派生类的函数,我们希望在派生类中他是可见的,因此可以在派生
阅读全文
摘要:1,尽可能延后对象中的变量定义式的出现,这样可以增加程序的清晰度,尽量少的调用构造,如果有定义变量最好在末尾定义并给予初值,这样就避免了默认构造函数的调用。 2 尽量少做转型操作。 const_cast 将对象的常量性转除。 dynamic_cast安全向下转型,用来确定某对象是否是否属于某继承体系
阅读全文
摘要:面向对象要求数据应该尽可能的被封装,然而与直观相反,成员函数带来的封装性比非成员非友元要低。 非成员函数可以允许函数有较大的包裹弹性。 如果某些东西被封装,则不可见,不可见的东西越多则我们就有越大的弹性去变化他,因为我们改变的仅仅直接影响看到改变的那些人事物。 另一方面如果非成员友元和成员函数机能相
阅读全文
摘要:下边代码它返回的A的一个引用指向的s2是一个局部的,从前的,但是如今已经被销毁的对象引用,已经不存在的引用。因此请记住:不要返回一个指针或者引用指向一个局部对象。也不要用指针引用返回一个指向局部静态的对象。函数内的局部对象在函数块运行结束了就销毁了、、、、、、、、、、、、、、、、 const a& bilibili(const a&s) { return a s2(s.x+s.y); }
阅读全文
摘要:首先: delete []p;是用来删除对象数组的,特别是你声明的是对象数组!!! 如果new中用了【】,delete一定要用【】;在new中没有使用,在delete中一定不要使用。 其次: 当你使用new的时候,首先内存被分配 ,然后针对此块内存,会有相应的构造函数被调用。 delete使用的时候
阅读全文
摘要:为了实现连锁赋值,赋值操作符必须返回一个引用指向左侧实参。(约定俗成) int x,y,z; x=y=z=20; so: weight& operator=(const weight& a) { ........... return *this;//返回左侧对象 } 注意:这只是一个协议,并无强制性
阅读全文
摘要:构造函数中不能有虚函数的原因: 原因一:基类构造期间虚函数不会下降到派生类阶段,也就是本身我们声明一个派生类对象,它应该先去调用基类的构造,若此时基类构造里面有虚函数,则这个虚函数是基类的虚函数,而不是继而到派生类里的虚函数。(即:要求使用对象内部尚未初始化的成分。。。错误的) 原因二:在派生类构造
阅读全文
摘要:一 构造析构常识: 1,c++ 处理类,若没有声明,则编译器默认声明构造,拷贝赋值,拷贝构造,析构函数。所有这些函数都是public且inline的。 2,编译器产出的析构函数是非虚函数。(non-virtual)。 3,拷贝构造和拷贝赋值函数作用就是拷贝非静态成员变量到目标对象处。 4,如果打算在
阅读全文
摘要:虽然有些时候int x;会被初始化为0,但是也可能不会,这就造成随机初始值会影响我们程序的运行。 类成员变量初始化顺序是依照其声明顺序而来的。基类要早于派生类别初始化。 构造函数最好使用成员初值列: classname(int name,int age,char sex):this.name(nam
阅读全文
摘要:1.#define为预处理阶段命令 原因:有可能记号名称没有进入记号表,而出现编译错误,即编译器并没看到过该定义。 class专属常量const 一般定义为static,保证该常量至多有一份实体。 枚举类型值可充当intS型使用。enum{num=3};现在num就是3的一个记号。 对于取地址操作:
阅读全文