C++面向对象编程知识点总结

一、复合类型
1.constexpr对象:声明constexpr的数据对象一定是常量且必须用常量表达式初始化
2.auto类型符:用auto声明变量的类型,由编译器去自动分析表达式的类型,推断出变量的实际类型;定义auto变量必须有初始值
3.decltype类型指示符:作用是选择并返回操作数的类型;编译器会分析表达式的类型,并不真正计算表达式的值
4.range-for:是一种简化的for语句,从头至尾对容器或序列的所有元素逐个执行某种操作
5.指针:类型 *指针变量;
“&”取地址运算符:取对象的地址
指针解引用运算符“”:通过指针间接访该对象
指针不能保存非地址值,也不能被赋值或初始化为不同类型的地址值
空指针:指针值为0时是一个空指针,即不指向任何对象的指针(0;nullptr;NULL)
同类型的指针可以进行相等()或不相等(!=)的比较操作,比较的结果是布尔类型
指针可以进行加或减整数值的算术运算
自增、自减运算适用于指向数组元素的指针==
void
指针:可以持有任何类型的地址值,即通用指针
6.new和delete运算符
new运算符:在堆上动态分配空间,创建对象,并返回对象的地址
分配单个对象:new 类型 或者 new 类型(初始值)
分配多个连续存储的对象:new 类型[数组大小]
定位new,在指定位置分配空间:new (指针) 类型;
delete运算符:
释放单个对象:delete 指针;
释放数组:delete[] 指针;
delete后的是“空悬指针”,指向不确定的单元,不能直接使用
7.引用(左值引用):引用必须被初始化,初始值是一个有内存地址的对象
定义:类型& 变量名=初始值;
引用并非对象,是为已存在的对象所起的另一个名字
引用只能绑定到对象(有内存地址)上,不能与字面值或某个表达式的计算结果绑定在一起
右值引用:右值引用就是必须绑定到右值的引用
定义:类型 &&右值引用变量 = 右值表达式;
8.const限定词:限定的对象不可改变
常指针:const type *cp;type const *cp;*cp的值不能改变
const引用可以绑定到const对象;不能用非const引用指向const对象
volatile限定词:限定的对象不能被编译器例行优化
9.结构体(struct):使用时通过“.”或者“->”使用。
stuct 结构体类型名{
成员声明;
};
10.begin()和end():头文件
begin(数组名):返回指向数组第一个元素的指针
end(数组名):返回指向数组最后一个元素的下一个位置的指针
两个指针相减的结果是它们之间的距离
11.string类:头文件
getline()函数:getline(cin, line);从指定输入流中读取内容,遇到换行符为止
empty():判断是否为空;size():返回个数
12.vector动态数组:头文件
vector<元素类型> 变量名;
empty();//返回bool类型,表示vector内是否为空
size();//返回vector内元素个数
push_back(date_type a);//将元素a插入最尾端
pop_back();//将最尾端元素删除(也可以从队友或队尾删除元素)
front();//返回第一个位置
back();//返回最后一个位置
clear();//清空ve
erase(pos);//可以清空一个位置的元素,也可以清空一个区间的元素,使用迭代器

13.文件读写:头文件
ifstream类:用来输入(读文件)的文件流
ofstream类:用来输出(写文件)的文件流
fstream类:把文件连接到流对象用来输入和输出
头文件<sstream>:
istringstream:从string对象中读取数据
ostringstream:向string对象写入格式化的内容
stringstream:从字符串读取数据,将数据写入字符串
二、函数
1.定义:返回类型 函数名(参数列表) { 函数体 }
函数必须指定一个返回类型;如果函数不返回任何结果,将其返回类型声明为void
调用执行函数的形式:函数名(实参列表);
2.函数调用时完成两项工作:用实参初始化函数对应的形参;将控制权转移给被调用的函数
return语句的作用:返回return语句中的值(如果有的话);将控制权从被调函数转移回主调函数
尾置返回类型的语法形式:auto 函数名(形参列表) -> 返回类型;
3.传值:按值传递,传指针,传引用
对于内置类型的小对象,传值的方式更简单直接
在函数内改变实参,使用传引用或传指针的方式
对于类类型的对象,尽量使用引用传递参数,效率更高
数组和函数作参数时必须传指针
拷贝构造函数的参数必须传引用

4.函数重载:同一个作用域内的几个函数名字相同但形参列表不同
非指针和引用上的const限定词不能区分重载函数
const限定指针或引用时,可以实现函数重载
5.生存期作用域和存储类别:
对象的生存期:指程序执行过程中对象存在的时间
名字的作用域:程序的一段区域,名字的作用域指的是该名字可以在哪些程序文本区使用。
对象的存储类别:创建对象时分配内存空间的方式和内存空间的类型
关键字extern 用来声明全局对象,可以在同一文件中或同一程序的不同文件中多次出现
局部对象默认为自动存储,可以通过存储类别关键字static 和register 对其进行修改
static的局部对象是静态存储的
static对象在控制流程第一次到达其定义点时被初始化,如果没有提供初始值,就被自动初始化为0值
register变量:函数中频繁使用的自动变量可以用register 关键字声明
静态分配是指在全局静态存储区为变量分配内存空间:编译时就分配了内存地址(相对地址);在程序开始执行时变量就占用内存,直到程序结束时变量才释放内存
自动分配指在程序的运行栈存储区中为变量临时分配内存空间:程序运行后,在变量作用域开始时由系统自动为变量分配内存,在作用域结束后即释放内存
动态分配是指利用被称为堆(heap)的内存块为变量分配内存空间
三、类和对象
1.类:自定义数据类型
结构体内的函数被称为成员函数,结构体中的数据则称为数据成员
扩展的结构体被称为类,结构体类型的变量被称为对象
数据成员类内初始值只能放在等号“=”右边,或者放在花括号“{}”里,不能使用圆括号“()”
类外定义的成员函数名字前面要加类名字和作用域符“::”

{
public:
      公有成员声明;
private:
      私有成员声明;
protected:
      被保护成员声明;
};

将数据和操作捆绑在一起,并加上访问控制,称为封装
数据描述对象的属性,操作描述对象的行为
2.sizeof 运算符:可以用于类类型、对象和类的数据成员
this指针是一个常量,含有当前实施调用的对象的地址
不能改变this指针的值,也不能取this指针的地址
访问器和修改器:常以一对getX()和setX() 函数的形式出现
3.friend关键字:可以让非成员函数访问一个类中的私有数据,可以将这个函数声明为friend
4.构造函数的名字和类名字相同,它没有返回类型
构造函数初始化列表:成员1(初始值1)[,成员2(初始值2),…]
构造函数(参数表) : 初始化列表 { 函数体 }
委托构造函数:ClassName(参数表):ClassName(参数表){函数体}
析构函数负责在对象生存期结束时返回相关资源和自动释放资源;
析构函数的名字是类名字前加波浪线“~”;
析构函数没有返回类型,也没有任何参数;
析构函数不能重载,只能为一个类定义唯一一个析构函数

6.在数据成员声明前加const 关键字就将其限定为常量;const 数据成员在构造函数的初始化列表中初始化
const成员函数:返回类型 成员函数名(参数表) const;
返回类型 成员函数名(参数表) const { 函数体 }
只有声明为const 的成员函数才可以被const 对象调用
成员访问运算符“.”或“->”
7.数据成员的指针:
对象.* 指向成员的指针
对象指针 ->* 指向成员的指针
成员类型 类名字::*指向成员的指针;
返回类型 (类名::*指向成员函数的指针)(参数表);
四、对象的初始化、复制和销毁
1.初始化:直接初始化,初始值在圆括号“()”中;直接初始化使用等号“=”;用one 初始化two 时需要构造函数X(X&),称为拷贝构造函数
X(X&),不能用const 对象来初始化另一个X 类型的对象
2.赋值和初始化
初始化是在创建新对象时进行,只能有一次;赋值可以对已存在的左值多次使用
类类型的对象在初始化时调用构造函数;赋值时调用重载后的运算符=
五、运算符重载
1.运算符重载:将运算符看作是一种特殊的函数,操作数是函数的参数,运算结果是函数的返回值
函数名由关键字operator 和其后要定义的运算符组成
operator=, operator<<, operator+
通常声明为类的友元,以便访问私有数据成员
赋值(=)、下标([])、函数调用(())和成员函数访问箭头(->)运算符必须是成员函数
2.一元运算符:
前缀和后缀形式都会改变对象,不能对常量对象操作
前缀形式返回改变后的对象,后缀形式返回改变之前的值
后缀形式的自增和自减比前缀形式多一个int参数,这个参数在函数中并不使用,只是作为重载函数的标记来区分前缀和后缀运算
重载自增和自减运算符时应同时定义前缀和后缀形式
3.二元运算符:
赋值运算符:赋值运算符只能用成员函数重载;复合赋值运算符可以用成员或非成员重载
4.一些运算符重载:
(1)输入输出运算符的函数原型:

istream& operator>>(istream&, type&);
ostream& operator<<(ostream&, const type&);

(2)重载下标运算符:
一个是非const 成员函数并返回引用
另一个是const 成员函数并返回const 引用或值
5.函数对象:如果一个类定义了函数调用运算符,那么该类的对象称为函数对象,或者仿函数
函数对象类除了operator()之外还可以包含其他成员
六、组合与继承
1.组合(包含):(复用类的实现)
将一个类的对象作为另一个类的成员
对象成员的初始化:
创建包含对象成员的组合对象时,会执行成员类的构造函数初始化对象成员,要注意,成员初始化的次序和成员声明的次序相同
当组合对象被撤销时,会执行其析构函数,成员对象的析构函数也会被执行
复用类的实现:应用组合,重新包装一个类对象,使之用于特定的环境
2.继承:(复用类的接口)
在已有类的基础上创建新类的过程
被继承的已有类称为基类;
继承得到的新类称为派生类;

派生类可以再被继承,这样构成的层次结构称为继承层次
继承类包含了多个代码的重复部分,为了避免重复代码多次书写将重复部分提出单独写一个类,用需要这部分功能的类去继承。
类继承关系的语法形式:

	class 派生类名 : 基类名表
 	{
	      数据成员和成员函数声明
 	};

基类名表 构成
访问控制 基类名1, 访问控制 基类名2 ,… , 访问控制 基类名n
访问控制 表示派生类对基类的继承方式,使用关键字:
public 公有继承
private 私有继承
protected 保护继承

继承过程中: 吸收全部基类成员 ;改造基类成员 ;添加新成员
3.重名成员:
==派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽了基类的同名成员
在派生类中使用基类的同名成员,显式地使用类名限定符:
类名 :: 成员 ==
基类和派生类共享基类中的静态成员
根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
派生类中访问静态成员:类名 :: 成员 或 对象名 . 成员
派生类构造函数声明为

派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 )… 对象成员n ( 变元表 ) ;

构造函数执行顺序:基类 ,对象成员,派生类
4.继承规则:
基类的构造函数和析构函数不能被继承
如果基类没有定义构造函数或有无参的构造函数, 派生类也可以不用定义构造函数
如果基类无无参的构造函数,派生类必须定义构造函数
如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造
派生类是否定义析构函数与所属的基类无关

5.派生类构造函数的一般格式为:

派生类::派生类名(参数总表):基类名(参数表)
{
     // 派生类新增成员的初始化语句
}

6.多继承:一个类有多个直接基类的继承关系称为多继承
多继承声明语法:

class  派生类名 : 访问控制  基类名1 ,  访问控制  基类名2 ,  … , 访问控制  基类名n
 {
         数据成员和成员函数声明
 };

多继承的构造函数:

派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),…,基类名n(参数表n)
{
      // 派生类新增成员的初始化
} 

七、虚函数与多态
1.多态性:是指一个名字,多种语义;或界面相同,多种实现。
虚函数:有virtual 关键字的成员函数称为虚函数
实现运行时多态的关键首先是要说明虚函数,另外,必须用
基类指针调用派生类的不同实现版本
2.注意:
一个虚函数,在派生类层界面相同的重载函数都保持虚特性
虚函数必须是类的成员函数
虚函数可以是另一个类的友元
析构函数可以是虚函数,但构造函数不能是虚函数
在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同
派生类应该从它的基类公有派生
必须首先在基类中定义虚函数
一般通过基类指针访问虚函数时才能体现多态性
一个虚函数无论被继承多少次,保持其虚函数特性
虚函数必是其所在类的成员函数,而不能是友元函数,也不能是静态函数
构造函数、内联成员函数、静态成员函数不能是虚函数
析构函数可以是虚函数,通常声明为虚函数
3.纯虚函数:只有函数名没有函数体

virtual  类型  函数名(参数表)= 0 ;

一个具有纯虚函数的基类称为抽象类。

你可能感兴趣的:(C语言C++专题总结)