千里之行始于足下,打牢基础是非常重要的,在对c和c++的知识学习了一段时间后,有些知识点的概念和特性也
不大熟悉了,所以自己准备将C++的知识点从头到尾仔细的复习一遍,理一理:
(1)C++的三大特点:
a. 封装:封装可以隐藏实现细节,使得代码模块化。封装是把过程和数据包围起来,对数据的访问只能通过已
定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通
过一个受保护的接口访问其他对象。在面向对象编程上可理解为:把客观事物封装成抽象的类,并且类可以把自己的
数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
b. 继承:继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些
功能进行扩展。其继承的过程,就是从一般到特殊的过程。通过继承创建的新类称为“子类”或“派生类”。被继承的类
称为“基类”、“父类”或“超类”。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。在某些
OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通
过多级继承来实现。
c. 多态:多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之
后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的
指针赋值给父类类型的指针。
(2)继承的实现方式:
a. 实现继承:指使用基类的属性和方法而无需额外编码的能力;
b. 接口继承:指仅使用属性和方法的名称、但是子类必须提供实现的能力;
c. 可视继承:指子窗体(类)使用基窗体(类)的外观和实现代码的能力;
(3)构造函数:
名字和类名相同,没有返回值,也不需要显式调用,在创建对象的时候自动执行,专门用来初始化对象的;
(4)访问权限:
在类的内部,无论public,protect,private都可以互相访问,没有限制;在类的外部,只能是通过对象访问public
的成员,不能访问private,protected成员;通过类的内部public的函数访问private;
(5)析构函数:
创造对象时用构造函数初始化;退出的时候用析构函数来退出,进行清理工作;释放分配的内存,关闭打开的文
件。Demo()----构造,~Demo()----析构函数 ;构造函数可以重载,析构函数只能一个,不能重载,析构没有参
数;
(6)const:
a. 在c++中和#define的作用差不多,在c中修饰的变量不允许改变,但是可以通过指针修改该单元内容,输出的时
候是修改后的内容;在c++中,虽然通过指针修改,但是输出仍然是原来的内容,输出不到内存取值;
b. c++中const的变量只能在本文件中可用,别的文件报错,而c没有这种限制;
(7)static:
a. 修饰局部变量:静态局部变量,执行完释放,初始化一次,
b. 修饰全局变量:只能在本文件中使用;
c. 修饰函数:只能在本文件使用
(8)this指针:
指向当前对象,通过它可以访问当前对象的所有成员。当前对象就是正在使用的对象;在类的内部使用,可以访
问所有的成员,public,private,protect。this只能在非静态成员函数内部使用,在其他地方非法;this 只能在对象创
建以后才能使用,否则非法;
(9)static成员变量:
static变量属于类,只能在类外部初始化;static变量是几个对象共享使用,相当于全局变量;
外部初始化的格式:
int Student::m_total = 0;
类型 类名::static变量 = 数值;
static 成员的访问形式:
a. 类名::static变量 : Student::m_total
b. 对象.(static 变量) : stu.m_total
c. 对象指针->(static成员变量) : pstr->m_total
(10)static函数:
没有this指针,只能访问static成员;
static函数声明时加static,定义的时候不加;
(11)const成员函数:
可以使用所有的成员,但是不能改变值,声明和定义函数时都要加const;
const对象只能调用类的const成员 ;
(12)友元函数friend:
在类外定义的,不属于当前类的函数,可以在当前类中声明,前面加friend,构成友元函数;
class Address
{
public:
friend class Student;
};
友员函数可以访问当前类的private成员;
友元函数不能直接访问类的成员,必须借助对象;
友员的关系是单向的,不是双向的;
友员关系不能传递:B是A的友员,C是B 友员, C和A之间不是友员关系;
(13)string类:
a. 包含头文件 <string>
string s1; 定义的时候没有初始化,默认是空;
string s2 = "c plus"; 定义并初始化 c plus ,没有‘\0’;
string s3 = s2; 定义s3,并把s2赋值给s3;
string s4 (3, 's'); 初始化为3个s;
string 输入时,cin是遇到空格默认结束;
string成员可以用下标访问;从0开始;
b. string 中字符串可以使用+, +=进行字符串的拼接;
c. string插入操作,insert
原型: string& insert(size_t pos, const string &str)
d. string删除操作:erase
原型:string& erase(size_t pos = 0, size_t length)
s2.erase(5);把s2第5个元素后面的内容全部删除;
s3.erase(5, 3);s3中第5个后面3个元素删除
e. string中substr
string substr (size_t pos = 0, size_t len = npos) const;
pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度。
s2 = s1.substr(3, 10);从第3个开始提取10给s2;
f. string查找find查找出现的位置:
其中的两种原型为:
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
(14)继承的方式:
a. public继承:
基类中public成员在派生类中还是public属性;
基类中protected成员在派生类中protected属性;
基类中private在派生类中不能使用;
b. protected继承
基类中public成员在派生类中为protected属性;
基类中protected成员在派生类中为protected属性;
基类中private在派生类中不能使用;
c. private继承
基类中public成员在派生类中为private属性;
基类中protected成员在派生类中为private属性;
基类中private在派生类中不能使用;
在派生类中访问基类的private成员的唯一方法就是借助基类的非private成员函数,如果没有这样的成员函数则
无法访问;
(15)改变访问权限using:
使用using改变基类成员在派生类中的访问权限;
如: public改成private,
存在问题: 在派生类中无法访问基类中private成员,如何用using修改,编译的时候报错;