【C++】运算符重载 运算符重载的方法是定义一个重载运算符函数,在需要执行被重载的运算符时,系统自动调用该函数。格式:函数类型 operator 运算符名称(形参列表)运算符重载的规则C++不允许用户自己定义新的运算符,只能对已有的运算符进行重载。 C++不能重载的运算符只有五个,其他的都可以重载 .(成员访问运算符) .*(成员指针访问运算符) ::(作用域解析符) sizeof(长度运算...
【C++】解析this指针 一个类可以有多个对象,怎么能保证引用的是所指定的对象的数据成员呢?在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,即this。它是指向本类对象的一个指针,他的值是当前被调用的成员函数所在对象的起始地址。举例:#include<iostream> ...
【C++】虚继承如何解决了菱形继承的二义性问题 从代码分析:#include<iostream>using namespace std;class A{public: int _a;};class B :virtual public A{public: int _b;};class C :virtual public A{public: int _c;};class D :public B, p...
【C++】继承切片问题与类型转换 在下面的代码中,student继承了person,将子类对象赋给父类对象、发生了切片。上面代码中的赋值不存在类型转换,这里讨论一下类型转换问题:为什么上面赋值编译不通过?因为存在类型转换,i需要生成临时变量,在赋值给r2引用,而临时变量存在常(const)性,需要在前面加const。什么情况下可以发生切片?子类对象可以赋值给父类对象/父类指针/父类的引用。虽...
【C++】new/delete底层原理和new[]/delete[] malloc和new的区别他们都是动态管理内存的入口。 malloc/free是C/C++标准库函数,new/delete是C++操作符。 malloc只是动态开空间释放空间,而new动态开空间并调用构造函数(初始化)和析构函数(清理) malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型,返回对应类型的指针。new底层原理:开空间。调...
变量存在的内存空间问题 例:static int a = 10;int b = 10;void Func(){ static int c = 10; int d = 10; char* p1 = "hello"; char p2[] = "hello"; int* p3 = (int*)malloc(4);}问题:strlen(p1):5 strlen(p2):5 sizeof(p1...
【C++】const+内联+静态成员+友元 const修饰成员函数在成员函数后面加const,const修饰this指针所指向的对象,保证这个const成员函数的对象在函数内不会被改变。注意点:const对象对象不可以调用非const成员函数 非const对象可以调用const成员函数 const成员函数内不可以调用其他的非const成员函数 非const成员函数内可以调用其他的const成员函数operator+可...
【C++】类型萃取 为什么要用到类型萃取?在C++中,想要对数据进行拷贝的话,通常有两种情况内置类型 自定义类型对于内置类型,我们可以使用memmove或memcpy来进行拷贝而对于自定义类型,我们需要使用赋值的方式来进行拷贝示例代码如下:struct TrueType{ bool Get() { return true; }};struct FalseType{ boo...
【C++】实现顺序表模板类 #include<iostream>#include<string.h>using namespace std;template<class T>class SeqList{ public: SeqList(); SeqList(const SeqList<T>& seq); SeqList& o...
【C++】多态 多态:即多种形态,调不同的函数,完成不同的功能。多态的条件:调用的函数必须是虚函数的重写 必须是父类的指针或引用多态分为:静态多态:就是重载,在编译时决议。 动态多态:通过继承重写基类的虚函数实现的多态,在运行时决议。 多态原理:如果构成了多态,则与对象有关,与类型无关。什么是斜变?派生类重写基类的虚函数实现多态中,要求函数名,参数列表,返回值完全相同。而斜...
【C++】继承基础知识 继承方式和访问限定符的关系三种继承方式:公有继承 私有继承 保护继承关系:若基类的成员函数为私有,则派生类对基类的私有成员是不可见的,其他的标准为选范围小的为最终访问限定。保护成员限定符:一些基类成员不想被基类的对象直接访问,但需要在派生类中才能访问,就定义为保护成员。保护成员限定符是因继承才出现的。理解隐藏隐藏是指派生类的函数屏蔽了与其同名的基类函数。规则如下:如果...
【C++】引用计数写时拷贝 为什么要引入引用计数写时拷贝?使用浅拷贝不浪费内存空间却容易发生内存泄漏问题,使用深拷贝不会发生内存泄漏但是会不断开辟新的空间,内存利用率低。因此结合深浅拷贝的优点产生了写时拷贝。在String类中添加新成员变量_pcount来计算指向同一段内存空间的指针的数目,若果要修改成员变量,当指针数目为小于等于1时就可以释放空间,大于1则另开辟空间来保存新的数据。代码如下:#incl...
【C++】深浅拷贝实现String类 什么是深浅拷贝?定义字符串char* str1="hello";现在定义一个字符串char* str2和str1的数据相同,这种情况分两种;str1和str2数据和空间都相同,即str2指向str1 的地址空间。 str2另开辟空间,再将str1的数据拷贝给str2,即str1和str2数据相同,指向的地址不同。第一种情况叫做浅拷贝,第二种情况叫做深拷贝而在C++中,使用浅拷贝...
【C++】实现data类 //#include<stdio.h>#include<iostream>#include<assert.h>using namespace std;class Date{public: Date(int year = 1900, int month = 1, int day = 1)//全缺省参数构造函数 :_year(year) , _...
【C++】赋值运算符重载的返回值分析 转载: https://blog.csdn.net/Always__/article/details/50532323其实对于重载赋值运算符,返回值是引用或者不是都行,代码都可以运行,之所以用引用是为了提高代码效率,为什么引用就会提高代码效率呢?对于返回值是CMystring时(非引用)。返回时,会自动生成一个临时对象来保存返回的这个内容,然后通过拷贝构造函数返回给调用这个函数的对象(*this)...
【C++】构造函数、析构函数、拷贝构造函数 构造函数概念:成员变量为私有的,需要用一个公有函数来对他们进行初始化。同时这个函数有且仅在定义对象时自动执行一次。特点:函数名和类名相同无返回值对象构造(对象实例化)时系统自动调用对应的构造函数。构造函数可以重载构造函数可以在类中定义,也可以在类外,在类外定义需要指定类域。如果类中没有给出构造函数,C++编译器会自动生成一个缺省的构造函数。但是只要我们自己定义了缺省的构造函数,编译器就不会再生成。...
【C++】类和对象 什么是面向对象?面向对象程序设计(OOP):对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装在其中,以提高软件的重用性,灵活性和扩展性。C++不是纯面向对象语言,而是基于面向对象的语言。面向对象的三大特性:封装,继承,多态类的大小?类的大小取决于类中所有成员变量的大小之和,也遵循内存对其原则。为什么要内存对齐?1.平台问题(移植原因)不是所有的硬件平台都能访问任意地址上的任意数据的;...
【C++】引用和指针 引用概念:引用不是定义一个新的变量。而是给一个已经定义的变量起一个别名。因为引用不需要额外开辟空间。用法:类型 &引用变量名=已定义过的变量名void TestReference2 (){ int d1 = 4; const int & d2 = d1; d1 = 5; // d1改变 d2的值也会改变。 //d2 = 6; // 不能给常量(不能...
【C++】C++入门介绍 C++与C:C++是C的增强版,C几乎是C++的一个子集,所以C语言支持的语法在C++基本都支持并需要使用。为什么C++支持重载,C语言不支持?1.函数重载:在同一作用域类,一组函数的函数名相同,参数列表不同(个数/类型不同),与返回值无关。不仅函数可以重载,运算符也可以重载。注意:main函数不能重载,因为程序的入口只有一个。2.翻译过程一般分为: 预处理—-编译——汇编——链接 预处理:展开头...