C++学习笔记之类基础

CPlusPlus 类基础
节选于C++primer中文完美版(第三版),方便以后复习。
目录:
1. 怎样定义类类型以及怎样使用类对象。
2. 隐含的this指针
3. 静态类成员
4. 指向类成员的指针
1. 怎样定义类类型以及怎样使用类对象?
类定义包含两部分:类头,由关键字class和类名组成;
类体,由一对花括号包围起来,包含类的数据成员和成员函数声明,并指定这些类成员的访问级别。
类定义后面必须接一个分号后一列声明。
每个类定义引入一个不同的类类型,即使两个类类型具有完全相同的成员表,它们任然是不同的类型。
访问限定符:private,public,protect
public 公有成员在程序的任何地方都能被访问
private 只能被成员函数和类的友元访问,实现信息隐藏
protect 对派生类就像public成员一样,对其他程序就像private一样
限定符缺省的时候,从类体开始的左括号后面的区域是private
友元:friend
类授权其它对象访问它的私有成员。友元以friend开头,不受访问限定符的影响。
类体定义了一个域,在类体中的类成员声明把这些成员名字引入到它们的类的域中。如果类有同名成员,那么程序不会出错,并且这两个成员将指向不同的对象。
引用类类型的方式
1. 指定关键字class,后面紧跟类名
2. 只指定类名
第一种方式是从C借鉴的,第二种是C++引入的
数据成员初始化:
除静态成员外,数据成员不能在类体中显示初始化。类数据成员通过类的构造函数进行初始化。
类声明和定义:
一旦到类体的结尾,即结束右括号,我们就说类被定义了一次。类定义了则类的所有成员和类大小也就已知了。
如果只有类头和分号,则称为类声明。类声明不知道类的大小和成员,可以声明指向类的指针和引用,即在类中声明类指针,见到类头则该类已被声明。
const成员函数:
只有声明为const的成员函数才能被一个const类对象调用。
声明方法:1. 关键字const放在成员函数参数列表和函数体之间
2. 对于定义在函数体外的const成员函数,在定义和声明中要同时指定关键字const。
3. 把一个修改类数据成员的函数定义为const的是非法的
4. const成员函数可以被同参数列表的非const成员函数重载,类的常量性决定调用哪个函数
一般来说,任何一个类如果期望被广泛使用,就应该把那些不修改数据成员的成员函数声明为const成员函数。把一个成员函数声明为const可以保证成员函数不修改类的数据成员,但是,如果该类包含指针,那么const成员函数可以修改指针指向的对象,编译器不会把这种修改检测为错误。
与const类对象类似的是volatile类对象
mutable数据成员:
关键字mutable修饰的数据成员,在const成员函数中可以被修改。
mutable数据成员永远不会是const成员,即使它是一个const对象的数据成员。
2. 隐含的this指针
每个非静态类成员函数都含有一个指向被调用对象的指针,这个指针被称为this。this指针是右值,存储对象的地址,编译时编译器直接确认对象地址,不需要显示存储在内存中。this指针只有在非静态成员中才有效,在函数调用前生成。
类数据成员在每个对象都有一份拷贝,而类成员函数只有一份拷贝供各个对象使用。成员函数可以直接引用类数据成员而不需要使用成员访问操作符,不同对象靠隐藏的this指针来绑定自己的类数据成员。
何时显示使用this指针:
1. 返回被调用的对象
2. 函数参数与成员变量同名时
3. 静态类成员
静态类数据成员只有一个拷贝,有该类型的所有成员共享访问。
同全局对象相比,静态数据成员的优点:
1. 静态数据成员不进入全局名字空间,不存在与程序中其它全局变量名冲突的可能性
2. 可以实现信息隐藏,静态成员可以是private成员,而全局对象不可以。
静态数据成员初始化的格式:<数据类型><类名>::<静态数据成员名>=<值>
静态数据成员引用格式:<类名>::<静态成员名>
作为特例,有序型的 const 静态数据成员可以在类体中用一常量值初始化。该成员必须仍然要被定义在类定义之外。但是,因为这个静态数据成员的初始值是在类体中指定的 所以在类定义之外的定义不能指定初始值。
当我们不通过类的成员访问操作符访问静态数据成员时 必须指定类名以及紧跟其后的域操作符。
静态数据成员可以被作为类成员函数的缺省实参,而非 static 成员不能。
注意事项:
      (1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。
      (2)不能将静态成员函数定义为虚函数。
      (3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。
      (4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X Window系统结合,同时也成功的应用于线程函数身上。
      (5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问时间,节省了子类的内存空间。
      (6)静态数据成员在<定义或说明>时前面加关键字static。
      (7)静态数据成员是静态存储的,所以必须对它进行初始化。
      (8)静态成员初始化与一般数据成员初始化不同:
初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;
初始化时使用作用域运算符来标明它所属类;
      (9)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。
4. 指向类成员的指针
类成员的指针必须总是通过特定的对象或指向该类类型的对象的指针来访问:
成员函数需要指定类类型
数据成员需要绑定类对象
静态类成员是属于该类的全局对象和函数 它们的指针是普通指针。
重编译器的角度,指向类成员的指针存储的是类成员对于类的偏移。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值