c++面向对象模型
c++类对象中的成员变量和成员函数是分开存储的,c语言中的内存4G模型仍然有效!
c++中类的普通成员函数都隐式包含一个指向当前对象的this指针。
静态成员函数、成员变量属于类
静态成员函数与普通成员函数的区别:
- 静态成员函数不包含指向具体对象的指针。
- 普通成员函数包含一个指向具体对象的指针。
c++编译器处理面向对象:
- 普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式。
- 静态成员变量:存储于全局数据区中。
- 成员函数:存储于代码段中。
const
-
const修饰的是This指针所指向的内存空间,修饰的是this指针
void opVar(int a, int b) const;
==> void opVar (const Test *this, int a, int b)
全局函数PK成员函数
-
把全局函数转化成成员函数,通过this指针隐藏左操作符
Test add(Test &ti, Test &t2) ==> Test add(Test &t2) -
把成员函数转换成全局函数,多了一个参数
void printAB() ==> void printAB(Test *pthis) -
函数返回元素和返回引用
Test &add(Test &t2) // *this 函数返回引用
{
this->a = this-> + t2.getA();
this->b = this-> + t2.getB();
return *this; // *操作让this指针回到元素状态
}
Test add2(Test &t2) // *this 函数返回元素
{
// t3是局部变量
Test t3(this->a + t2.getA(), this->b+ t2.getB());
return t3;
}
友元函数
友元函数破坏了类的封装性,可以修改类的私有变量
class A{
public:
A(int a, int b){
this->a = a;
this->b = b;
}
// 声明的位置与public、private没有关系
// 函数modifyA是类A的好朋友
friend void modifyA(A *pA);
private:
int a;
int b;
};
void modifyA(A *pA){
pA->a = 100;
}
友元类
- 若B类是A类的友元类,则B类的所有成员函数都是A类的友元函数。
- 友元类通过设计为一种对数据操作或类之间传递消息的辅助类。
class A{
friend class B; // B是A的友元
public:
void Display() {
debug("x\n");
}
private:
int x;
};
class B{
public:
void Set(int i) {
Aobject.x = i;
}
void Display() {
Aobject.Display();
}
private:
A Aobject; // B中有个A,A是B的子属性
};
运算符重载
运算符重载使得用户自定义的数据以一种更简洁的方式工作。
运算符重载机制:让自定义数据类型可以进行运算符操作。
- 运算符函数是一种特殊的成员函数或友元函数
- 成员函数的语法形式为:
类型 类名::operator op (参数表)
返回值 关键字 函数名 操作数
{
// 相对于类定义的操作
} - 一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符
列如:
// 全局函数 完成 + 操作符 重载
Complex operator+(Complex &c1, Complex &c2)
// 类成员函数 完成 - 操作符 重载
Comolex operator-(Complex &c2)
运算符重载本质是函数调用
-
二元运算符
ObjectL op ObjectR
重载为成员函数,解释为:
ObjectL operator op(ObjectR)
左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递
重载为友元函数,解释为:
operator op(ObjectL, ObjectR)
左右操作数都由参数传递 -
一元运算符
Object op 或 op Object
重载为成员函数,解释为:
Object operator op()
操作数由对象Object通过this指针隐含传递
重载为友元函数,解释为:
operator op(Object)
操作数由参数表的参数Object提供