C++类和对象总结
1.函数重载的条件:
a. 同一作用域
b. 参数名相同
c. 形参列表(参数个数,类型,顺序)不同
2.函数调用约定
a. _cdecl
b. _stdcall
c. _thiscall
3.引用
1). 概念:引用不是定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用 同一块内存空间
2). 用法: 类型& 引用变量名(对象名) = 引用实体
3). 引用特性:
a. 引用在定义时必须初始化;
b. 一个变量可以有多个引用;
c. 引用一旦引用一个实体,再不能引用其他实体;
4. 引用的使用场景
a. 作为函数参数 ;
b. 作为函数的返回值 ps:不能返回栈空间上的引用;
5. 引用和指针的区别
相同点:底层的实现方式相同,都是按照指针的方式来实现的(引用在底层就是一个指针,相当于指针常量, 即&相当于 * const);
不同点:
1). 引用在定义时必须初始化,指针没有要求
2). 一旦一个引用被初始化为指向一个对象,就不能在指向其他对象,指针
可以在任何时候指向任何一个对象
3). 没有NULL引用,但有NULL指针
4). 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址
空间所占字节个数
5). 引用自加改变变量的内容,指针自加改变指针指向
6). 有多级指针,但是没有多级引用
7). 指针需要手动寻址,引用通过编译器实现寻址
8). 引用比指针用起来嫌贵安全
4.命名空间
在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局命名空间中,会导致很多冲突, 使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
1). 命名空间的定义
namespace N1 //N1为命名空间的名称
{
void test();//命名空间中的内容,既可以是定义变量,也可以是定义函数
}
//命名空间可以嵌套
//同一工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间
说明:
(1).一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间;
(2).没有名称的命名空间,他的成员只在声明该命名空间的文件中可以访问,访问时不需要加命名空间名称,对于其他命名空间中内容不可见;
2. 命名空间的使用方法
(1).NI::test();
(2).using N1::test();
(3).suing namespace N1;
5.类
1).类中的数据称为类的属性或者类的成员变量,类中的函数称为类的方法或者类的成员函数;
2).C++的三大特性:封装,继承,多态;
3).封装: 隐藏对象的属性和实现细节,仅对外公开接口和对象进项交互,将数据和操作数据的方法进行有机结合。
(1).public成员在类外可以直接访问;
(2).protected和private成员在类外不能够访问;
(3).他们的作用域从访问限定符出现的位置开始直到下一个访问限制符出现为止;
(4).class的默认访问权限是private,而struct为public型(因为要兼容C);
ps:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
4).一个类的大小,实际就是该类中成员变量之和,空类的大小为1字节(视现实而定)
6.this指针
1).类的成员函数有一个隐藏的指针,指向了调用该函数的对象本身。
2).this指针特性
(1).this指针的类型: 类类型* const;
(2).this指针并不是对象本身的一部分,不影响sizeof的结果;
(3).this的作用域在类“成员函数”的内部;
(4).this指针是“类成员函数”的第一个默认隐含参数,编译器自动维护传递类编写者不能显示传递;
(5).只有在类的非静态成员函数中才可以使用this指针,其他任何函数都不可以 ;
7.类6个默认的成员函数
1).构造函数;
2).拷贝构造函数;
3).析构函数;
4).赋值操作符重载;
5).取地址操作符重载;
6).const修饰的取地址操作符重载;
8.构造函数
1).概念:构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,在对象的生命周期内只能调用一次,保证每个数据成员都有一个合适的初值
2).构造函数的特性
(1).函数名于类名相同;
(2).没有返回值;
(3).新对象被创建是,由编译器自动调用,且在对象声明周期内仅调用一次;
(4).构造函数可以重载,实参决定刻调用那个构造函数;
(5).无参构造函数和带有缺省的构造函数都认为是缺省的构造函数,并且缺省的构造函数只能有一个;
(6).有初始化列表(可以不用);
(7).如果没有显示定义时,编译器会合成一个默认的构造函数;
(8).构造函数不能用const修饰;
(9).构造函数不能为虚函数 ;
3).类中包含以下成员,一定要放在初始化列表位置进行初始化:
引用成员函数;
const成员变量;
类类型成员(该类有费缺省的构造函数);
4).构造函数的作用
(1).构造 初始化对象;
(2).类型转换;
对於单个参数构造函数,可以将其接受参数转化成类类型的对象。用explicit修饰构造函数,抑制由构造函数定义的隐式转换,explicit关键字类内部的构造声明上,在类的定义体外部的定义不在重复。
9. 拷贝构造函数
1).概念:只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用
2).特征:
(1).构造函数的性质拷贝构造函数均满足;
(2).参数必须使用类类型对象的引用传递;
(3).如果没有显示定义,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化。
3).使用场景
(1).对象实例化对象;
(2).作为函数参数;
(3).作为函数返回值;
10.析构函数
1).概念:与构造函数功能相反,在对象被销毁时,由编译器调用,完成类的一些资源清理工作和汕尾工作。
2).特性:
(1).析构函数在类名加上字符~;
(2).析构函数无参数无返回值;
(3).一个类有且只有一个析构函数。若未显示系统会自动生成缺省的析构函数;
(4). 对象声明周期结束,C++编译器系统自动调用析构函数;
(5). 注意析构函数体内并不是删除对象,而是做清理工作;
11.友元
友元分为:友元函数和友元类。
1).友元函数:可以直接访问累的私有成员,他是定义在累外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加上friend关键字。
2).友元函数特性:
(1).友元函数可访问类的私有成员,但不是类的成员函数;
(2).友元函数不能用const修饰;
(3).友元函数可以在类定义的任何地方声明,不受访问限定符限制;
(4).一个函数可以是多个类的友元函数;
(5).友元函数的调用于普通函数的调用和原理相同;
3).友元类
友元类的所有成员函数都可以另外一个类的友元函数,都可以访问另一个类中的非公有成员。
4).优缺点
优点:提高了程序运行效率;
缺点:破坏了类的封装性和隐藏性;
5)注意:
(1).友元关系不能继承;
(2).友元关系是单向的,不具有交换性;
(3).友元关系不能传递;
12.运算符重载
1).概念:重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同,使用运算符重载可以提高代码的可读性返回值 operator 操作符(参数列表)。
2).特性:
(1).不能通过连接其他符号来创建新的操作符:比如operator@;
(2).重载操作符必须有一个类类型或者枚举类型的操作数;
(3).用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不能改变其含义;
(4).作为类成员的重载函数,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参;
(5).一般将算术操作符定义为非成员函数,将赋值运算符定义成员函数;
(6).操作符定义为非类的成员函数时,一般将其定义为类的友元;
(7).== 和 != 操作符一般要成对重载;
(8).下标操作符[]:一个非const成员并返回引用,一个是const成员并返回引用;
(9).解引用操作符*和->操作符,不显示任何参数;
(10).前置式++/–必须返回被增量或者减量的引用,后缀式操作符必须返 回旧值,并且应该是值返回而不是引用返回;
(11).输入操作符>>和输出操作符<<必须定义为类的友元函数;
参考博文:1、C++类和对象知识点总结