C++学习总结

一、对象的初始化、复制和销毁
1.1 对象的初始化
对象的初始化需要构造函数来实现,初始化是在创建一个对象时赋予其一个初始值,C++有不同的初始化形式,要调用不同的构造函数。

1)默认初始化
定义对象时没有指定初值,对象默认初始化,调用类内默认构造函数。
2)直接初始化
初始值写在对象后的()中,例如: X a(…),调用类内相对应的构造函数。
3)拷贝初始化
用等号“=”初始化一个对象时,执行拷贝初始化,用等号右边的初始值创建一个对象,复制给新创建的对象。例如 HaveAll two=one;用one调用HaveAll(HaveAll &),复制给two;
HaveAll four=4;用4调用HaveAll(int),复制给four;
拷贝构造函数声明为私有的,调用时会报错。
4)列表初始化
用花括号{}中的初始值构造对象,调用相应的构造函数,与直接初始化类似。
HaveAll five { 5 }; 列表初始化,5是一个对象的初始值。
花括号还可以是一个初始值的列表来初始化数组的每个元素,如果初始化的值小于数组个数,后面的则调用默认构造函数。
HaveAll arr[3]{8,9};

1.2 隐式类型转换构造函数
可以用一个实参调用的构造函数也被看作是进行类型转换的函数,可以将参数类型的数据转换为类类型。
如果不希望自动进行类型转换,可以在构造函数声明前加 explicit 关键字,禁止隐式转换。
只能在直接初始化起作用。

1.3 析构函数
析构函数执行与构造函数相反的操作,析构函数释放对象使用的资源,并销毁对象的非静态数据成员,如同构造函数有初始化部分和函数体,析构函数也有函数体和隐式的析构部分。
析构函数先执行函数体,然后销毁成员,成员按初始化的逆序销毁。
销毁类类型的成员需要执行成员自己的析构函数,销毁没有析构函数的内置类型成员什么也不需要做,销毁内置指针类型的成员不会delete指针指向的对象。

二、拷贝构造函数
拷贝构造函数、拷贝复制运算符和析构函数时最基本的拷贝控制操作。
用一个对象去初始化另一个对象需要一个构造函数X(X&),成为拷贝构造函数。
如果类内未定义该函数,编译器则会自动合成一个,默认行为是按成员复制。
X two(one);就是用one中的每个成员分别去初始化two的每个对应的成员,这种行为也叫浅复制
简单来说,浅复制不一定得到理想结果,浅复制就是简单赋值,而相对于深复制是先申请空间再复制
数据成员为复杂类型(引用,指针)用深复制,简单类型用浅复制。

拷贝构造函数的一般形式是X(X&)或者X(constX&),拷贝构造函数是X(X&),不能用const对象初始化另一个X类型的对象,因为参数类型不匹配。

三、拷贝赋值运算符
重载赋值运算符,operator=,重载运算符后,类类型的对象就可以直接进行赋值操作。
类X的赋值运算符要定义为类X的成员函数,形式为:
X& operator=(const X&);

四、运算符重载
C++中,不只是函数可以重载,某些运算符也是可以重载的,即可以自定义运算符的功能,在将这些运算符重载之后,运算符就被赋予了的新的功能,重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表:

Complex operator+(const Complex&, const Complex&);//重载+运算符 实现两个复数相加

输入输出流重载时需要用到友元。

1.1 运算符函数
重载的运算符包含返回类型,参数表以及函数体。定义重载运算符和定义普通函数类似。
运算符函数的参数个数取决于以下的两个因素:
1)运算符的操作个数,即是一元运算符还是二元运算符。
2)运算符函数是成员函数还是非成员函数。
当为成员函数时,调用成员函数的对象(this指向的对象)被作为运算符的第一个操作数,因此对医院的无需再提供参数。使用成员函数重载二元时,当前对象为左操作数,只需要提供一个参数作为右操作数。
当为非成员函数时,重载一元运算符时需要提供一个类类型的参数,重载二元需要提供两个参数,作为左、右操作数(至少一个为类类型),一般非成员运算符函数声明为类的友元。

1.2 重载时应注意?
答:1、 逻辑运算符和关系运算符应返回bool值,算术运算符应该返回操作数类型的值,赋值运算符和复合运算符返回左操作数对象的引用。
2、如果定义了operator=和operator+,提供operator+=也是自然的。
3、赋值= 、下标[ ] 、函数调用() 、个成员访问箭头-> 、必须是成员函数。
4、复合赋值运算符一般是成员,但非必须。
5、自增、自减、解引用通常是成员。
6、算术、关系和位运算符等,通常是非成员函数。
重载移位运算符<<和>>,左操作数是标准库流函数,右操作数菜时类类型的对象,只能用非成员函数。

五、组合与继承
1】组合——复用类的实现
1.1 对象成员与组合关系
将一个类的对象作为另一个类的成员。对象成员语法也被称作组合包含

2】继承——复用类的接口
2.1 继承的语法
在已有类的基础上继承得到新类。新类自动拥有旧类的特性,并可以修改继承的特性或者增加自己的新特性。被继承的已有类称为基类,新类称为派生类,派生类可以作为基类再被继承,这样构成的层次结构称为继承层次
2.2公有继承和私有继承
共有派生类继承了基类的接口,共有派生类看作是基类的子类型。
继承时,基类中protected数据可以继承,private不能继承

私有派生类虽然继承了积累的所有数据和功能,但这些只是作为派生类的部分私有实现,派生类的用户不能访问这些内部功能。基类和私有派生类之间不是类型和子类型的关系。
私有继承时,基类所有的public成员在派生类中都变成private。

2.3 重名成员
派生类定义了与基类同名的成员,在派生类中访问同名成员时**屏蔽(hide)**了基类的同名成员。
在派生类中使用基类的同名成员,显示的使用类名限定符:
类名::成员

2.4 派生类中访问静态成员
1基类定义的静态成员,将被所有派生类共享
2根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
3派生类访问静态成员,用以下形式显示说明:
类名::成员
或通过对象访问
对象名.成员

2.5 多重继承
如果一个派生类只有唯一的基类,这个继承关系叫单继承,一个派生类直接继承多个基类,称为多重继承。
语法如下:
class 派生类名:访问限定符 基类1,访问限定符 基类2…{};
访问限定符 不写默认为private。

六、虚函数与多态性
面向对象的核心概念是封装。继承和多态性。C++通过虚函数和堕胎绑定实现多态性。
概念:
1、多态性是指一个名字,多种语义,或界面相同,多种实现。
2、重载函数是多态的一种简单形式。
3、虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编

1】虚函数
前面写关键字virtual的成员函数称为虚函数
实现多态的关键首先是要说明虚函数,再利用基类指针调用派生类的不同实现版本。

注意:一个虚函数,在派生类层界面相同的重载函数都保持虚特性
虚函数必须是类的成员函数
虚函数可以是另一个类的友元
析构函数可以是虚函数,构造函数不能。

在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型完全相同。
如果函数原型不同,仅仅是函数名相同,丢失虚特性。

2】虚析构函数
用于指引delete运算符正确析构动态对象。

3】说明:
1.派生类应该从他的基类公有派生。
2.必须首先在基类中定义虚函数。
3.派生类对基类中声明虚函数重新定义时,关键字virtual可不写。
4.一般通过基类指针访问虚函数时才能体现多态性。
5.一个虚函数无论被继承多少次,保持虚函数特性。
6.虚函数必须是所在类的成员函数,不能是友元或静态。

4】纯虚函数
纯虚函数是一种特殊的虚函数
基类中不能对虚函数有实际意义的实现,把他声明为纯虚函数,实现留给派生类。
纯虚函数为各派生类提供一个公共界面
语法形式为:
virtual 类型 函数名(参数)=0;
一个具有纯虚函数的类叫做抽象类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值