【C++】运算符重载-赋值
C++编译器至少给一个类添加4个函数
默认构造函数(无参,函数体为空)
默认析构函数(无参,函数体为空)
默认拷贝构造函数,对属性进行值拷贝
赋值运算符 operator= ,对属性进行值拷贝
如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题
示例:
12345678910111213141516171819202122232425262728293031323334353637383940#include <iostream>using namespace std;class Person {public: Person(int age) { Age = new int(age); } ~Person() { if (Age != NULL) { delete Age; Age = NULL; } } Person &operator=(Person &p) { if (Age != NULL) { delete Ag ...
【C++】运算符重载-递增递减
省流
前置递增(递减)返回引用,后置递增(递减)返回值
代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#include <iostream>using namespace std;class myInt { friend ostream& operator<< (ostream &cout,myInt myint);public: myInt() { m_Num = 0; } //前置递增 myInt& operator++() { m_Num++;//先进行++运算 return *this;//再将自身返回 } //后置递增 myInt operator++(int) { myInt temp = *this;//先记录结果 m_Num++;//再递增 return temp ...
【C++】运算符重载-加号
对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型
总结:
对于内置的数据类型的表达式的运算符是不可能改变的
不要滥用运算符重载
直接进行加法运算
报错1234567891011121314151617181920#include <iostream>using namespace std;class Person {public: int m_A; int m_B;};int main(){ Person p1; Person p2; p1.m_A = 10; p2.m_A = 20; p1.m_B = 30; p2.m_B = 40; Person p3 = p1 + p2;//报错 cout << "p3.m_A=" << p3.m_A << endl; cout << "p3.m_B=" << p3.m_B << endl; return 0;}
使用自己的成员函数进行运算
正常
1 ...
【C++】运算符重载-左移
左移运算符的重载可以帮助我们更好的输出自定义的数据类型,可以做到简洁,在不浪费更多代码行的情况下,使用函数,来输出类中的成员属性数据
注意
成员函数 实现不了 p<<cout不是我们想要的效果
全局函数实现左移重载 ostresm对象只能有一个
代码1234567891011121314151617181920212223#include <iostream>using namespace std;class Person {public: int m_A; int m_B;};ostream &operator<< (ostream &cout,Person &p) { cout << "m_A=" << p.m_A << endl; cout << "m_B=" << p.m_B << endl; return cout;}int main(){ Pers ...
【C++】const修饰成员函数
常函数
成员函数后加 const 后,我们称这个函数为常函数
常函数内不可修改成员属性
成员属性声明时加关键字 mutable 后,在常函数中依然可以修改
代码示例1234567891011121314151617181920212223242526#include<iostream>using namespace std;class Person {public: void showPerson() const{ //在成员函数后面加const,修饰的是 this指向 ,让指针指向的值也不可修改 //this指针的本质是 指针常量 ,指针的指向是不可修改的 this->m_A = 100;//报错,常函数内不可修改成员属性 //const Person * const this this = NULL;//报错,不可修改 this指针 的指向 //Person * const this this->m_B = 100;// 正常 } int m_A; mutable int m_B;//特殊变量,即使在常函数 ...
【C++】全局函数做友元
在程序里,有些私有属性 也想让类外函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元关键字为 friend
代码示例12345678910111213141516171819202122232425262728293031#include<iostream>using namespace std;//建筑物类class Building { friend void goodGay(Building* building);//全局函数是 Builiding 好朋友,可以访问私有成员public: Building() { m_BedRoom = "卧室"; m_SittingRoom = "客厅"; }public: string m_SittingRoom;private: string m_BedRoom;};void goodGay(Building *building) { cout << " ...
【C++】类做友元
在程序里,有些私有属性 也想让类外函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元关键字为 friend
代码示例1234567891011121314151617181920212223242526272829303132333435363738394041424344#include<iostream>using namespace std;class Building;class GoodGay {public: GoodGay(); void visit();//参观函数 访问Building中的属性 Building* building;};class Building { //GoodGay是本类的好基友,可以访问本类中私有成员 friend class GoodGay;public: Building();public: string m_SittingRoom;private: string m_BedRoom;};//类外写成员函数Building::B ...
【C++】成员函数做友元
在程序里,有些私有属性 也想让类外函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元关键字为 friend
代码示例123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <iostream>using namespace std;class Building;class GoodGay {public: GoodGay(); void visit();//可以访问Building中私有成员 void visit2();//不可以访问Building中私有成员 Building *building;};class Building { friend void GoodGay::visit();//告诉编译器 GoodGay类中的visit成员函数是Building类的好基友,可以访问私有内容public: Building();publi ...
【C++】成员变量和成员函数分开存储
在C++中,类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象上
空对象代码示例12345678910111213#include<iostream>using namespace std;class Person { //空对象};int main() { Person p; cout << "sizeof(p)= " << sizeof(p); return 0;}
输出结果为: sizeof(p)= 1
解释
空对象占用内存空间为: 1
C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
每个空对象也应该有一个独一无二的内存地址
非静态成员变量代码示例12345678910111213#include<iostream>using namespace std;class Person { int m_A;//非静态成员变量};int main() { Person p; cout & ...
【C++】this指针
每一个非静态成员函数只会诞生一份函数实例,也就是说多个类型的对象会共用一块代码
C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象
注意:
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
用途
当形参和成员变量同名时,可用this指针来区分
在类的非静态成员函数中返回对象本身,可使用return *this
解决名称冲突123456789101112131415161718#include<iostream>using namespace std;class Person {public: Person(int age) { this->age = age; //this指针指向被调用的成员函数所属的对象 int age;};int main() { Person p1(18); cout << "p1的年龄:" << p1.age; return 0; ...