目录
初始化列表
静态成员
静态成员变量
静态成员函数
c++对象模型
this指针
空指针
const修饰成员函数
友元
运算符重载
初始化列表
语法:构造函数():属性1(值1),属性2(值2)...{}
静态成员
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员变量1.所有对象共享一份数据
2.在编译阶段分配内存
3.类内声明,类外初始化
静态成员函数所有对象共享同一个函数
静态成员函数只能访问静态成员变量
c++对象模型
c++中成员变量和成员函数分开存储‘
只有非静态的成员变量才属于类的对象上
ps:空对象占用的存储空间为1
this指针每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
为了区分是哪个对象调用自己
c++提供特殊的对象指针,this指针指向被调用成员函数所属的对象
用途:
- 当形参和成员变量同名时,可用this指针来区分
- 在类的非静态成员函数中返回对象本身,可使用return *this
C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针
如果用到this指针,需要加以判断保证代码的健壮性
const修饰成员函数
常函数:
- 成员函数后加const后我们称为这个函数为常函数
- 常函数内不可以修改成员属性
- 成员属性声明时加关键字mutable后,在常函数中依然可以修改
常对象:
- 声明对象前加const称该对象为常对象
- 常对象只能调用常函数
友元
关键字:friend
三种实现:
1.全局函数做友元
2.类做友元
3.成员函数做友元
运算符重载
运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型;并且运算符重载可以发生函数重载。
加号运算符重载:实现两个自定义数据的相加运算
1.对于内置的数据类型的表达式的的运算符是不可能改变的
2.不要滥用运算符重载
左移运算符重载:配合友元可以输出自定义数据类型
由于不能实现cout在左侧,所以不用成员函数来重载左移运算符
递增运算符(++)重载:
前置递增返回的是引用,后置递增返回的是值
#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
class Text
{
public:
int data;
Text() {
data = 0;
}
Text& operator++() {
data++;
return *this;
}//前置递增运算
Text operator++(int) {
Text temp = *this;
data++;
return temp;
}//后置递增运算
};
ostream& operator<<(ostream& cout, Text p)
{
cout << p.data;
return cout;
}
int main()
{
Text p;
}
赋值运算符(=)重载:c++编译器自动为类添加赋值运算符operator=, 对属性进行值拷贝。
如果类中有属性指向堆区,做赋值 *** 作时也会出现深浅拷贝问题。
class Person
{
public:
Person(int age)
{
//将年龄数据开辟到堆区
m_Age = new int(age);
}
//重载赋值运算符
Person& operator=(Person& p)
{
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
//编译器提供的代码是浅拷贝
//m_Age = p.m_Age;
//提供深拷贝 解决浅拷贝的问题
m_Age = new int(*p.m_Age);
//返回自身
return *this;
}
~Person()
{
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
}
//年龄的指针
int* m_Age;
};
关系运算符重载:可以让两个自定义类型对象进行对比 *** 作
class MyPrint
{
public:
void operator()(string text)
{
cout << text << endl;
}
};
void test01()
{
//重载的()操作符 也称为仿函数
MyPrint myFunc;
myFunc("hello world");
}
class MyAdd
{
public:
int operator()(int v1, int v2)
{
return v1 + v2;
}
};
void test02()
{
MyAdd add;
int ret = add(10, 10);
cout << "ret = " << ret << endl;
//匿名对象调用
cout << "MyAdd()(100,100) = " << MyAdd()(100, 100) << endl;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)