您的位置:首页 > 编程语言 > C语言/C++

菜鸟潇寒学习C++笔记------第二部分

2013-12-26 17:55 351 查看
19.初始化列表
在构造函数定义里紧跟参数之后可以有一个初始化列表,用冒号开头,后面有若干对"成员变量

(初始化)",多对之间用逗号分开。初始化列表是初始化常量成员和引用成员的不二法门。

20.静态成员初始化不应该在构造函数里面。
静态成员:属于整个类的数据或者行为。
静态成员变量:所有这个类的对象公用一份,在类外面初始化,访问不需要对象,

初始化时要在变量明前面用"类名::"修饰。
静态成员函数:所有这个类的对象共同的行为,不依赖任何一个对象,

因此静态成员函数中不存在this,只能访问静态成员,访问非静态成员必须要指明对象。

21.动态创建和释放对象

new 类名 delete   地址

new 类名 (参数) delete   地址

new 类名  [个数] delete[] 地址

返回的都是地址。delete p;p=NULL。

一个变量的创建和释放:
全局变量:main执行之前创建,main返回后释放
静态局部变量:第一次执行创建,main返回释放
普通局部变量(含形参):每次执行的时候创建,超出作用范围释放
临时结果:临时创建,完成一次使用就释放。
动态变量:执行new时创建,执行delete是释放。

22.析构函数:对象释放时候会自动调用的函数,函数名为~类名,总是无参,无法重载,

一般也是公开的,无返回类型。

   默认析构函数:如果没有定义析构函数,编译器会自动产生一个默认析构函数(不干事情)。

   如果想在main函数之前或者之后做一些工作,可以用全局对象的构造函数和析构函数来实现。

   

   对象本生占用的空间会在超出作用范围的时候或者delete时自动释放,

如果对象还额外分配了资源,可以在析构函数中释放那些额外的资源。

23.匿名对象:直接定义一个对象但是不提供名字,这个对象会在这个语句之后就立即释放,

而且编译器能对匿名对象的使用进行最大限度的优化性能。提倡使用匿名对象,前提是他一次性对象。
类名  变量名(参数)-->正常状态
类名   (参数)------->匿名对象,没有变量名,对象只能单场使用。

   只有一个参数时候,匿名对象可以看成是类型转换。

   如果要禁止自动用匿名对象实现类型装换,可以用explicit修饰构造函数。

24.拷贝构造函数:当用一个同类的对象,初始化一个同类的新类的时候,

调用的自然是拷贝构造函数。一个类如果没有定义拷贝构造函数,编译器会自动产生

一个构造函数,内容是逐个复制对应的成员。这样一般能满足程序要求。

但是其中有指针成员函数指向动态内存的时候,两个对象指针成员都指向相同地方,

两个对象释放都会delete这块动态内存从而导致错误。

为了避免这样的错误,需要自己写拷贝构造函数,让每一个对象指针成员各自

指向一片动态内存,把旧对象动态中的数据复制过去,让两片动态内存的数据相同。

*****零初始化:类型名(),对于基本类型而言是数值0,对于类或者结构体而言就是匿名对象。*********

--------------------------------------------------------------------------------

第四天

30.面向对象的扩展功能

备注:编译器在编译的时候,会扫描累的定义(不包含函数体),之后扫描累的实现(各个成员函数体,

静态成员变量初始化),所以类的成员函数里面可以访问在后面才出现的成员。

   const对象调用的成员函数也要求不会修改成员变量的数据。成员函数可以在参数表后面用const来

宣称自己不会修改当前对象的数据,称为const成员函数。用const对象只能调用const成员函数。

  const对象内部如果有需要修改的数据成员,用mutable来修饰即可。

31.运算符重载:在C++中,运算符都被当成函数。C++允许程序自己来规定预算符如何工作,

方法就是自己定义相应的运算符函数,比如operator&,operator+,operator<<,称为运算符重载。

***函数代替运算符,其中函数参数对应运算符的操作数,函数返回值对应运算的结果。

***预算符函数的形参和返回类型尽量用引用,尽量加const.

32运算符函数的定义格式之一:全局函数:

        返回类型 operator 运算符 (参数表)

******* 双目 运算结果的类型 operator 运算符(操作数1,操作数2)

******* 单目 运算结果的类型 operator 运算符(操作数)

      在全局函数中如果需要访问对象的非公开成员,需要在类中对这个全局变量函数进行授权,

方式是在类里面用friend声明这个函数为友元,友元函数不是成员函数。一般在外面定义,

也可以在类里面friend声明的地方直接定义,但是他依旧是友元,不是成员。

    如果需要的话,一个类A也可以吧另外一个类B声明为友元,这等同于把B类的所有成员

函数都等同于A类的友元了。一般不这样做,而友元声明是单向的,不传递的。

33:运算符函数定义格式之二:成员函数
返回类型 operator运算符(除第一个操作符之外的参数)

******* 双目:运算结果类型 operator 运算符(第二个操作数)

******* 单目:运算结构类型 operator 运算符()//无参数!!
以成员函数定义时,第一个操作数作为当前对象,不需要作为实参传递,只需要传递剩余的

操作数就可以了。在运算符函数里面可以通过*this或者this->来访问第一个操作数。
规定只能用成员函数的[],(),=,->,类型转换。

如果有指针成员指向动态内存,还应该自己写赋值运算符函数来实现跟拷贝构造函数相似的功能。

三大:拷贝构造,赋值,析构

35.类型转换运算符函数格式:
operator 类型名()---->>>operator int()
不写返回类型,返回类型跟“类型名”一致,只能是成员函数。

   圆括号作为运算符时候,参数个数不定。函数定义格式:
返回类型 operator ()(参数表)
支持圆括号运算符的对象也称为函数对象,因为使用的形式特别像调用函数。

36.运算符重载
->
new/delete
++/--

1:00
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 语言 面向对象