第三部分:类和数据抽象
十二章:类(*this指针)
1.const成员函数: double abc() const; 注意:const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。const在函数()之后哦。
2.使用类型别名进行简化:class ABC{ public: typedef std::string::size_type myinttype;}
3.类向前声明:class ABC; 这时候只能使用这个类的指针和引用,他的内部成员和函数是不明确的。(这样就可以编写相互依赖的类了)
4.为什么类以分号结束,因为他本身就是struct的变体,他也可以这样定义变量阿:class abc{} a , b;
5.mutable变量,可以在const函数中改变。
6.用于const对象的构造函数:
class abc{ public: abc() const; }; | 类初始化列表 abc::abc(string book):isb(book), icout(0), recc(0.0){}
abc::abc():icout(0), recc(0.0){}
7.const成员和引用类型成员以及没有默认构造函数的类型,必须在初始化列表进行初始化;否则编译不通过。
8.explicit来防止隐士构造转换
9.友元:
class abc{
friend class def;//这样,def就能引用abc中的私有成员了。
};
def& def::lala(abc a)
{
return def(a.height);
}
使用其他类的成员函数成为友元
class abc{
friend def& def::lala(abc&); //必须用def类::来修饰一下
};
1.static成员是仅仅类作用域的。且所有该类对象共享该static对象。(保证对象只定义一次); 只能放在声明中,不要放在定义中。以免编译器搞混,以为在cpp中定义了一个static对象。(如果包含多次不就被多次定义了么)
2.static函数成员是没有this指针的,因为this是对象,是动态的东西。而这个static函数是静态就创建好的东西了。
3.const static 成员;1.要在声明时候初始化 2.同时还必须在定义中进行定义不赋值;如下:
1. class abc{ const static int count = 0; }; ==> 2. const int abc::count;
4.static东东不属于类对象的组成部分,属于所有类对象的共用东东。
5.mutable不可修饰const变量,因为他的的解释是互相矛盾的
十三章:复制控制
1.具有指针成员的类,就得重写。。。
2.iostream是不允许复制的,所以复制构造函数定义为了private
3.Abc(const Abc&); 拷贝构造函数
4.赋值函数(重载):Abc& operator=(const Abc&); 一般来说,需要用到拷贝构造,都需要用到赋值函数。operator=,同时也是需要西沟函数的。 (检查对自身的复制)
5.西沟函数:~Abc();,没有返回值没有参数
6.智能指针:需要计数器的使用。就这样吧
十四章:重载操作符与转换
1.不能重载内置对象的操作符含义、不能使用默认实参、
2.操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元:例如cout<<1;
3.赋值必须返回*this的引用
struct abs{
int operator()(int val)
{
return val < 0? -val:val;
}
}
abs(1);//调用一个对象,这个对象重载了()操作符
4. operator int() const {return val;} 转换成员函数:不指定返回类型,形参表必须为空,:可以消除二义性哦
十二章:类(*this指针)
1.const成员函数: double abc() const; 注意:const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。const在函数()之后哦。
2.使用类型别名进行简化:class ABC{ public: typedef std::string::size_type myinttype;}
3.类向前声明:class ABC; 这时候只能使用这个类的指针和引用,他的内部成员和函数是不明确的。(这样就可以编写相互依赖的类了)
4.为什么类以分号结束,因为他本身就是struct的变体,他也可以这样定义变量阿:class abc{} a , b;
5.mutable变量,可以在const函数中改变。
6.用于const对象的构造函数:
class abc{ public: abc() const; }; | 类初始化列表 abc::abc(string book):isb(book), icout(0), recc(0.0){}
abc::abc():icout(0), recc(0.0){}
7.const成员和引用类型成员以及没有默认构造函数的类型,必须在初始化列表进行初始化;否则编译不通过。
8.explicit来防止隐士构造转换
9.友元:
class abc{
friend class def;//这样,def就能引用abc中的私有成员了。
};
def& def::lala(abc a)
{
return def(a.height);
}
使用其他类的成员函数成为友元
class abc{
friend def& def::lala(abc&); //必须用def类::来修饰一下
};
1.static成员是仅仅类作用域的。且所有该类对象共享该static对象。(保证对象只定义一次); 只能放在声明中,不要放在定义中。以免编译器搞混,以为在cpp中定义了一个static对象。(如果包含多次不就被多次定义了么)
2.static函数成员是没有this指针的,因为this是对象,是动态的东西。而这个static函数是静态就创建好的东西了。
3.const static 成员;1.要在声明时候初始化 2.同时还必须在定义中进行定义不赋值;如下:
1. class abc{ const static int count = 0; }; ==> 2. const int abc::count;
4.static东东不属于类对象的组成部分,属于所有类对象的共用东东。
5.mutable不可修饰const变量,因为他的的解释是互相矛盾的
十三章:复制控制
1.具有指针成员的类,就得重写。。。
2.iostream是不允许复制的,所以复制构造函数定义为了private
3.Abc(const Abc&); 拷贝构造函数
4.赋值函数(重载):Abc& operator=(const Abc&); 一般来说,需要用到拷贝构造,都需要用到赋值函数。operator=,同时也是需要西沟函数的。 (检查对自身的复制)
5.西沟函数:~Abc();,没有返回值没有参数
6.智能指针:需要计数器的使用。就这样吧
十四章:重载操作符与转换
1.不能重载内置对象的操作符含义、不能使用默认实参、
2.操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元:例如cout<<1;
3.赋值必须返回*this的引用
struct abs{
int operator()(int val)
{
return val < 0? -val:val;
}
}
abs(1);//调用一个对象,这个对象重载了()操作符
4. operator int() const {return val;} 转换成员函数:不指定返回类型,形参表必须为空,:可以消除二义性哦