- C++三大特点
a.封装:封装一方面可以实现代码的模块化,容易实现代码的复用,另一方面可以对代码功能部分隐藏起来,只提供一个借口给调用者。数据只可以通过特定的类或对象函数进行访问。
b.继承:继承可以实现现有类的所有功能并在无需重新编写原来的类的情况下对这些功能进行扩展。其继承的过程就是一般到特殊的过程。通过继承创建的新类叫“子类”或“派生类”,被继承的类叫“父类”或“基类”。要实现继承可以通过“继承”(Inheritance)和“组合”(Composition)来实现,在某些oop语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
c.多态:多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说就是:允许将子类类型的指针赋值给父类类型的指针。
2. 继承实现方式:
a.实现继承:指使用基类的属性和方法而无需额外编码的能力;
b.接口继承:指仅使用属性和方法的名称、但是子类必需提供实现的能力;
c.可视继承:指子窗体(类)使用基窗体(类)的外观和实现代码的能力;
3. 构造函数:
名字和类名相同,没有返回值,也不需要显示调用,在创建对象的时候自动执行,专门用来初始化对象的;
4. 访问权限:
在类的内部,public,private,protected的数据或函数都可以互相访问,没有限制,在类的外部,只能通过对象访问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 lenth)
s2.erase (5);把s2后第五个元素后面的内容全部删除;
s3.erase(5,3);s3中第五个元素后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修改,编译的时候报错;
借鉴:https://blog.csdn.net/perfectguyipeng/article/details/73694848