c++高级编程
从0开始学习,把自己打造成c++大神
lianghe_work
热爱linux
展开
-
50_菱形继承
具有公共祖先 的多继承class Animal{public: int data;};class Sheep:public Animal{public:};class Tuo:public Animal{public:};class SheepTuo:public Sheep,public Tuo{public:};int main(int argc, char *argv[]){ SheepTuo st; //SheepTuo 从Shee原创 2020-05-21 21:46:41 · 410 阅读 · 0 评论 -
47_父类和子类的同名 成员函数 处理
案例:1子类继承父类所有成员函数 和成员变量class Base{public: void func(void) { cout<<"父类中的void func"<<endl; } void func(int a) { cout<<"父类中的int func a = "<<a<<endl; }};class Son:public Base{public原创 2020-05-21 21:12:38 · 1356 阅读 · 0 评论 -
46_父类和子类的同名 成员变量 处理
1、当 父类和子类 成员变量同名时 在子类就近原则 选择本作用域的子类成员2、如果在子类中 必须使用父类中的同名成员 必须加上父类的作用域。class Base{ //父类的私有数据 一旦涉及继承 在子类中不可见public: int num;public: Base(int num) { this->num = num; cout<<"Base有参构造int"<<endl; } ~原创 2020-05-19 21:37:08 · 2013 阅读 · 0 评论 -
45_详解 子类中的构造
1、子类会默认调用 父类的 无参构造2、子类 必须显示 使用初始化列表 调用 父类的有参构造调用形式:父类名称。Son(int a,int b):Base(a),b(b){ //this->b = b;}class Base{private: int a;public: Base() { cout<<"父类的无参构造函数"<<endl; } Base(int a) {原创 2020-05-19 21:29:15 · 303 阅读 · 0 评论 -
44_子类中 有父类、对象成员 构造和析构的顺序
父类的构造和析构 对象成员的构造和析构 子类自身的构造和析构总结:(重要)class Other{public: Other() { cout<<"对象成员的构造函数"<<endl; } ~Other() { cout<<"对象成员的析构函数"<<endl; }};class Base{public: Base() { co原创 2020-05-19 21:26:01 · 530 阅读 · 0 评论 -
43_继承中的构造和析构顺序
class Base{public: Base() { cout<<"父类的无参构造函数"<<endl; } ~Base() { cout<<"父类中的析构函数"<<endl; }};class Son:public Base{public: Son() { cout<<"子类的无参构造"<<endl; .原创 2020-05-13 22:49:25 · 295 阅读 · 0 评论 -
42_继承的内层接结构
当前演示在vstudio中class Base{public: int a;protected: int b;private: int c;};class Son :public Base{public: int d; int e;};int main(int argc, char* argv[]){ cout << sizeof(Son) << endl; return 0;}步骤:原创 2020-05-13 22:46:41 · 135 阅读 · 0 评论 -
41_继承和派生的概述
1、继承和派生的概述继承的优点:减少代码的冗余 提高代码的重用性2、继承的格式派生类定义格式: Class 派生类名 : 继承方式 基类名{ //派生类新增的数据成员和成员函数 }; class 子类: 继承方式 父类名{ //子类新增的数据成员和成员函数 };继承方式分类:public : 公有继承 (重要)private : 私有继承 protected : 保护继承父类个数分类:单继承:指...原创 2020-05-13 22:36:54 · 176 阅读 · 0 评论 -
40_不要重载&&、||
不要重载&&、|| 因为 用户无法实现 && ||的短路特性。&& 短路特性: A && B 如果A为假 B将不会执行|| 短路特性: A || B 如果A为真 B将不会执行#include <iostream>using namespace std;class Complex{public: Complex(int flag){ this->flag = flag; }原创 2020-05-12 23:04:48 · 146 阅读 · 0 评论 -
39_函数调用符()的重载
#include <iostream>using namespace std;class Fun{public: int my_add(int x,int y) { return x+y; } //重载() //第一个()是重载的符号 第二个()是标明要传参 int operator()(int x,int y) { return x+y; }};void test01(){ .原创 2020-05-12 23:01:53 · 157 阅读 · 0 评论 -
38_等于和不等于(==、!=)运算符重载
//重载== ==出现在判断语句中 bool operator==(Person &ob) { if(strcmp(this->name, ob.name) == 0) { return true; } return false; } //重载!= !=出现在判断语句中 bool operator!=(Person &ob) { .原创 2020-05-12 22:59:40 · 357 阅读 · 0 评论 -
37_重载=运算符
前提1:类中 没有指针成员 不需要重载=运算符(默认的浅拷贝就可以完成)#include <iostream>using namespace std;class Person{private: int a; int b;public: Person():a(0),b(0) { cout<<"无参构造"<<endl; } Person(int a, int b):a(a),b(b) {原创 2020-05-11 22:17:08 · 124 阅读 · 0 评论 -
36_重载指针运算符* ->
#include <iostream>using namespace std;class Person{private: int num;public: Person(int num):num(num) { //this->num = num; cout<<"有参构造num = "<<num<<endl; } void showPerson(void) { .原创 2020-05-11 22:13:32 · 293 阅读 · 0 评论 -
35_重载自增运算符
1、可重载的运算符2、重载自增 或自减 ++ --运算符operator++编译器看到++a(前置++),它就调用operator++(a),当编译器看到a++(后置++),它就会去调用operator++(a,int).#include <iostream>using namespace std;class Data{ friend ostream& operator<<(ostream &out, Data &ob);原创 2020-05-11 21:37:39 · 1516 阅读 · 0 评论 -
34_重载加法运算符
1、全局函数作为友元 完成运算符重载+1+1 这种情况下 不需要重载 编译器能够计算#include <iostream>#include<string.h>using namespace std;class Person{ //设置成友元函数 在函数内 访问Person类中的所有数据 friend ostream& operator<<(ostream &out, Person &ob); friend原创 2020-05-08 20:37:49 · 1325 阅读 · 1 评论 -
33_运算符输出重载
1、重载运算符的概述运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型运算符重载的目的:简化操作 让已有的运算符 适应适应不同的数据类型。语法:函数的名字由关键字operator及其紧跟的运算符组成比如:重载+运算符 ==>operator+ 重载=号运算 ==>operator=注意:重载运算符 不要更改 运算符的本质操作(+是数据的相加 不要重载成相减)2、重载<<运算符#include <iostream>原创 2020-05-08 20:28:19 · 231 阅读 · 0 评论 -
32_一个类整体作为另一个类的友元
一个类的所有成员函数 访问 另一个类的私有数据#include <iostream>using namespace std;class Room;//Room向前声明class GoodGay{public: void visit1(Room &room);//此处的Room 被上方 class Room void visit2(Room &room);};class Room{ //将GoodGay作为Room的友元原创 2020-05-08 20:08:19 · 573 阅读 · 0 评论 -
31_友元函数
c++允许 友元 访问 私有数据。友元的语法:friend关键字只出现在声明处 其他类、类成员函数、全局函数都可声明为友元 友元函数不是类的成员,不带this指针 友元函数可访问对象任意成员属性,包括私有属性1、普通全局函数 作为 类的友元//房间类class Room{ //将goodGayVisit作为类的友元函数 //goodGayVisit 访问 类中...原创 2020-04-29 20:55:55 · 334 阅读 · 0 评论 -
30_c++中的const与类的使用
1、const修饰成员函数用const修饰的成员函数时,const修饰this指针指向的内存区域,成员函数体内不可以修改本类中的任何普通成员变量, 当成员变量类型符前用mutable修饰时例外int myFun(void) const //const修饰的是成员函数{}//函数内部不能修改 普通成员变量 mutable修饰时例外class Data{private: ...原创 2020-04-29 20:48:37 · 293 阅读 · 0 评论 -
29_this指针的使用
1、当形参和成员变量同名时,可用this指针来区分class Data{public: int num; //形参 和成员名相同 void setNum(int num) { //形参num //成员num this->num //num= num;//就近原则 形参num 赋值给 形参num ...原创 2020-04-29 20:33:32 · 217 阅读 · 1 评论 -
28_c++类中的this指针详解
1、引入c++的封装性:将数据 和 方法 封装在一起数据 和 方法 是分开存储。每个对象 拥有独立的数据.每个对象 共享同一个方法class Data{public: int m_num; void setNum(int num) { m_num = num; }};void test01(){ Data...原创 2020-04-28 22:33:24 · 254 阅读 · 0 评论 -
27_单例模式
单例模式的步骤:步骤1:在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例步骤2:提供一个公共静态的方法,让客户可以访问它的唯一实例。步骤3:为了防止在外部对实例化其他对象,将其默认构造函数和拷贝构造函数设计为私有#include <iostream>using namespace std;class Printer{public...原创 2020-04-27 23:19:06 · 147 阅读 · 0 评论 -
26_静态成员案例之统计类实例化对象的个数
#include <iostream>using namespace std;class Data{public: Data() { cout<<"无参构造"<<endl; count++; } Data(const Data &ob) { cout<...原创 2020-04-27 23:16:44 · 1542 阅读 · 0 评论 -
25_const修饰静态成员
如果一个类的成员,既要实现共享,又要实现不可改变,那就用 static const 修饰class Data{public: const static int data;//静态成员变量(类内声明)public: //静态成员函数 属于类 而不属于对象 static int getDataStatic(void) { //num = 2...原创 2020-04-27 23:13:26 · 287 阅读 · 0 评论 -
24_类的静态成员注意事项
注意:1、静态成员函数的目的 操作静态成员数据。2、静态成员函数 不能访问 非静态成员数据。(静态成员函数内部没有this指针)3、普通成员函数 可以操作 静态成员数据 非静态成员数据4、静态成员变量 和 静态成员函数 都有权限之分。...原创 2020-04-27 23:11:25 · 166 阅读 · 0 评论 -
23_类的静态成员
1、进程成员的概述成员:成员变量 成员函数static 修饰成员变量 修饰成员函数static声明为静态的,称为静态成员。 不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。静态成员 属于类 而不是对象2、static 修饰成员变量静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。静态成员变量必须在类中声明,在类...原创 2020-04-27 23:07:21 · 152 阅读 · 0 评论 -
22_对象数组
1、对象数组 本质是数组 只是数组的每个元素是类的对象运行结果:2、如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化void test07(){ //对象数组 arr1是数组 每个元素是Person类型的对象 //定义对象数组的时候 系统会自动给 数组中的每个元素 调用构造函数 //人为 为元素 调用有参构造 //初始化部分...原创 2020-04-26 21:19:46 · 192 阅读 · 0 评论 -
21_new和delete详解
1、和malloc calloc realloc比较1.1、malloc返回一个void指针,c++不允许将void赋值给其他任何指针,必须强转。1.2、malloc可能申请内存失败,所以必须判断返回值来确保内存分配成功。1.3、malloc 不会调用构造函数。free 不会调用析构函数(重要的)2、new 给基本类型申请空间void test01(){ //基本类...原创 2020-04-26 21:07:32 · 155 阅读 · 0 评论 -
20_explicit关键字详解
C++提供了关键字explicit,禁止通过构造函数进行的隐式转换。声明为explicit的构造函数不能在隐式转换中使用class Data{private: int num;public: //explicit 该有参构造函数 不允许 隐式转换 explicit Data(int n):num(n) { cout<<"有参构...原创 2020-04-26 20:56:22 · 192 阅读 · 0 评论 -
19_初始化列表
目录1、概述2、类的对象作为另一个类的成员 时 对象成员 会使用初始化列表1、概述构造函数和其他函数不同,除了有名字,参数列表,函数体之外还有初始化列表注意:初始化成员列表(参数列表)只能在构造函数使用class Data{private: int m_a; int m_b; int m_c;public: //成员名(形参名)...原创 2020-04-23 22:16:19 · 305 阅读 · 0 评论 -
18_构造函数的分类以及调用
1、构造函数分类按参数类型:分为无参构造函数和有参构造函数按类型分类:普通构造函数和拷贝构造函数(复制构造函数)2、构造函数的调用class Data{public: int num;public: //构造函数(无参的构造) Data() { num = 0; cout<<"无参的构造函数 num...原创 2020-04-22 23:26:37 · 1578 阅读 · 0 评论 -
17_构造和析构函数概述
1、构造和析构函数的概述构造函数和析构函数,这两个函数将会被编译器自动调用,构造函数完成对象的初始化动作,析构函数在对象结束的时候完成清理工作。注意:对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化操作和清理操作,编译器也会给你增加默认的操作,只是这个默认初始化操作不会做任何事。构造函数:实例化对象的时候系统自动调用析构函数:对象释放的时候系统自动调用2、构...原创 2020-04-21 23:07:15 · 165 阅读 · 0 评论 -
16_c++和c混合编程
1、概述以下在Linux下测试:c函数: void MyFunc(){} ,被编译成函数: MyFuncc++函数: void MyFunc(){},被编译成函数: _Z6Myfuncv通过这个测试,由于c++中需要支持函数重载,所以c和c++中对同一个函数经过编译后生成的函数名是不相同的,这就导致了一个问题,如果在c++中调用一个使用c语言编写模块中的某个函数,那么c++是根据c...原创 2020-04-20 22:25:16 · 185 阅读 · 0 评论 -
15_函数重载
1、函数重载的概述函数重载:同一个函数名在不同场景下可以具有不同的含义重载的意义:C++允许功能相近的函数在相同的作用域内以相同的函数名定义,从而形成重载,方便使用。函数重载的条件: 同一个作用域 参数个数不同 参数类型不同 参数顺序不同(重要)void myFunc(int a){ cout<<"int的myFunc"<<endl;}voi...原创 2020-04-17 23:25:10 · 186 阅读 · 0 评论 -
14_详解函数的默认(缺省)参数
1、缺省参数概述c++在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值,当函数调用的时候如果没有传递该参数值,编译器会自动用默认值代替。//函数的默认参数 指定x的默认值为10 y为20int my_add(int x=10,int y=20){ return x+y;}void test02(){ //如果函数传参 那么各自的默认参数将无效 ...原创 2020-04-16 22:43:27 · 1698 阅读 · 0 评论 -
13_细谈内联函数inline
1、宏函数(带参数的宏)的缺点:第一:在c中也会出现,宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误(比如参数的完整不能完全避免)。第二:是c++特有的,预处理器不允许访问类的成员,也就是说预处理器宏不能用作类的成员函数。2、内联函数的特点:内联函数:内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数,返回值类型的安全检查,又可以作为成...原创 2020-04-15 22:54:29 · 154 阅读 · 0 评论 -
12_引用之用法详解
1、引用作为函数的参数void my_swap1(int a,int b){ int tmp = a; a = b; b=tmp;}void my_swap2(int *a,int *b)//a=&data1,b =data2;{ int tmp = *a; *a = *b; *b = tmp;}void my_swap3...原创 2020-04-14 22:58:05 · 188 阅读 · 0 评论 -
11_引用之给已有的变量取个别名
1、引用的概述引用是c++对c的重要扩充。在c/c++中指针的作用基本都是一样的,但是c++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference),它也存在于其他一些编程语言中,并不是c++的发明。变量名实质上是一段连续内存空间的别名,是一个标号(门牌号) 程序中通过变量来申请并命名内存空间 通过变量的名字可以使用存储空间对一段连续的内存空间只...原创 2020-04-13 23:07:14 · 817 阅读 · 0 评论 -
10_尽量const替换define
1、const和define的总结2、宏没有类型 const有#define MAX 1024const short my_max =1024;void func(short i){ cout<<"short函数"<<endl;}void func(int i){ cout<<"int函数"<<endl;}...原创 2020-04-10 23:07:36 · 266 阅读 · 0 评论 -
09_细谈c++的const
1、C语言的const特点const int a = 10;//不要把a看成常量//a的本质 是变量 只是 只读变量c语言的const修饰全局变量 默认是(外部链接的)fun.c//c语言的const修饰全局变量 默认是(外部链接的)//外部链接:其他源文件 可以使用const int num = 100;//只读的全局变量 内存放在文字常量区(内存空间只读)main...原创 2020-04-10 00:01:36 · 148 阅读 · 0 评论