#include<iostream> #include<string> using namespace std; //运算符<<重载 //全局函数重载 class Person { public: string m_name; int m_age; }; ostream& operator<<(ostream& out, Person& p) { cout << "name:" << p.m_name << endl; cout << "age:" << p.m_age << endl; return out; } void test() { Person per; per.m_name = "xiaohu"; per.m_age = 20; cout << per<<endl; } void main() { test(); system("pause"); }
运行结果:
访问权限:
public:类内类外都可访问
protected:类内可以访问,类外不可访问,子类可以访问
private:类内可以访问,类外不可访问,子类不可访问
class的默认权限是私有,struct的默认权限是公有
构造和析构函数有编译器自动调用,只调用一次;析构函数不可以有参数
拷贝构造函数:构造函数的参数是该类的对象
Person (const Person & p){ }
使用情况:使用一个已经创建完毕的对象来初始化一个新对象 Person p1; Person p2(p1);
值传递方式给函数参数传值 void test (Person p){ }
值方式返回局部对象 Person test( ){ }
匿名对象:Person(10);当执行完该行代码,系统会立即回收掉匿名对象。 匿名函数对象:Person()(10);用在函数调用运算符()的重载
c++编译器会自动给每个类添加至少3个函数,默认构造,析构函数,拷贝函数。如果定义了拷贝函数,系统不会提供其他构造函数;定义了有参构造,系统不会提供无参构造,会提供拷贝构造函数。
浅拷贝:简单的赋值拷贝操作,问题:堆区的内容重复释放
深拷贝:在堆区重新申请空间(new)),进行拷贝操作 ,解决浅拷贝问题
析构函数将堆区开辟的数据做释放操作.
静态成员变量:所有对象共享同一份数据,在编译阶段分配内存,类内声明,类外初始化
静态成员函数:所有对象共享同一个函数,只能访问静态成员变量 访问方式:类名::静态成员函数
常函数内不可修改成员属性,在成员属性声明时加关键字mutable,在常函数中依然可以修改
常对象只能调用常函数
对象成员:先调用对象成员的构造,再调用本类的构造函数;调佣析构函数正好相反
空对象占用内存空为1个字节,(分配空间是为了区分空对象之间占用内存的位置)
this指针:
指向被调用的成员函数所属的对象
隐含在每一个非静态成员函数内
用途:返回对象本身 *this
形参与成员变量重名时,可用来区分
本质:指针常量
运算符重载:operator 符号
也可以函数重载
左移运算符<<重载:void operrator<<(ostream cout,Person &p)
重载前置运算符++返回引用,是为了一直在对一个数据进行递增操作
void operator++(int) int 是站位参数,用于区分前置和后置递增
仿函数:就是对函数调用运算符重载()
由于重载后使用的方式非常像函数的调用,固此称为仿函数。