c++重点笔记3

#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 是站位参数,用于区分前置和后置递增

仿函数:就是对函数调用运算符重载()

               由于重载后使用的方式非常像函数的调用,固此称为仿函数。

           

            

原文地址:https://www.cnblogs.com/0901-hcx/p/14959837.html