1 静态成员
1.1 静态成员变量
1.1.1 所有对象都共享同一份数据
1.1.2 编译阶段就分配内存
1.1.3 类内声明、类外初始化
1.1.4 访问方式有两种:通过对象访问、通过类名访问
1.1.5 静态成员变量也是有访问权限
1.2 静态成员函数
1.2.1 所有对象都共享同一份函数
1.2.2 静态成员函数 只可以访问 静态成员变量,不可以访问非静态成员变量
1.2.3 静态成员函数 也是有访问权限的
1.2.4 静态成员函数 有两种访问方式:通过对象 、通过类名
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person
{
public:
static int m_A;
static void func()
{
m_A = 100;
cout << "func调用" << endl;
}
int m_C;
private:
static int m_B;
static void func2()
{
}
};
int Person::m_A = 0;
int Person::m_B = 0;
void test01()
{
Person p1;
cout << p1.m_A << endl;
Person p2;
p2.m_A = 100;
cout << p1.m_A << endl;
cout << Person::m_A << endl;
}
void test02()
{
Person p1;
p1.func();
Person::func();
}
int main(){
test02();
system("pause");
return EXIT_SUCCESS;
}
2 单例模式 – 主席类案例
2.1 通过一个类 只能实例化唯一的一个对象
2.2 私有化
2.2.1 默认构造
2.2.2 拷贝构造
2.2.3 唯一实例指针
2.3 对外提供 getInstance 接口,将指针返回
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class ChairMan
{
public:
static ChairMan * getInstacne()
{
return singleMan;
}
private:
ChairMan(){};
ChairMan(const ChairMan &){};
private:
static ChairMan * singleMan;
};
ChairMan * ChairMan::singleMan = new ChairMan;
void test01()
{
ChairMan * c1 = ChairMan::getInstacne();
ChairMan * c2 = ChairMan::getInstacne();
if (c1 == c2)
{
cout << "c1 = c2" << endl;
}
else
{
cout << "c1 != c2" << endl;
}
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
3 单例模式 – 打印机案例
3.1 和主席类案例一样设计单例模式
3.2 提供打印功能并且统计打印次数
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <string>
class Printer
{
public:
static Printer * getInstance()
{
return printer;
}
void printText(string text)
{
m_Count++;
cout << text << endl;
}
int m_Count;
private:
Printer()
{
m_Count = 0;
};
Printer(const Printer & p){};
static Printer * printer;
};
Printer * Printer::printer = new Printer;
void test01()
{
Printer * p1 = Printer::getInstance();
p1->printText("入职证明");
p1->printText("离职证明");
p1->printText("加薪申请");
p1->printText("旅游申请");
cout << "打印机使用次数: " << p1->m_Count << endl;
Printer * p2 = Printer::getInstance();
p2->printText("调休申请");
cout << "打印机使用次数: " << p1->m_Count << endl;
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
4 C++对象模型初探
4.1 类中的成员变量 和 成员函数 是分开存储的
4.2 只有非静态成员变量 属于类对象上
4.3 空类的sizeof结果 1
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person
{
public:
int m_A;
void func( )
{
}
static int m_B;
static void func2()
{
}
double m_C;
};
int Person::m_B = 0;
void test01()
{
Person p1;
cout << "sizeof = " << sizeof(p1) << endl;
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
5 this指针
5.1 this指针 指向 被调用的成员函数 所属的对象
5.2 this指针可以解决名称冲突
5.3 this指针 隐式加在每个成员函数中
5.4 *this 就是本体
5.5 p1.personAddPerson(p2).personAddPerson(p2).personAddPerson(p2); //链式编程
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
this->age = age;
}
bool compareAge(Person &p)
{
if (this->age == p.age)
{
return true;
}
return false;
}
Person& personAddPerson(Person &p)
{
this->age += p.age;
return *this;
}
int age;
};
void test01()
{
Person p1(10);
cout << "p1的年龄为: " << p1.age << endl;
Person p2(10);
bool ret = p1.compareAge(p2);
if (ret)
{
cout << "p1与p2年龄相等" << endl;
}
p1.personAddPerson(p2).personAddPerson(p2).personAddPerson(p2);
cout << "p1的年龄为: " << p1.age << endl;
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
6 空指针访问成员函数
6.1 如果成员函数中没有用到this指针,可以用空指针调用成员函数
6.2 如果成员函数中用到了this,那么这个this需要加判断,防止代码down掉
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person
{
public:
void showClass()
{
cout << "class Name is Person" << endl;
}
void showAge()
{
cout << "age = " << this->m_Age << endl;
}
int m_Age;
};
void test01()
{
Person * p = NULL;
p->showAge();
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
7 常对象和常函数
7.1 常函数
7.1.1 成员函数 声明后面加const
7.1.2 void showPerson() const
7.1.3 const目的是为了修饰成员函数中的this指针,让指针指向的值不可以修改
7.1.4 有些属性比较特殊,依然在常函数或者常对象中可以修改,需要加入关键字 mutable
7.2 常对象
7.2.1 const Person p
7.2.2 常对象也不许修改成员属性
7.2.3 常对象只能调用常函数
7.3 对于成员函数 ,可不可以 用static 和 const同时修饰 ,不可以
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
this->m_Age = age;
}
void showPerson() const
{
m_A = 100;
cout << "person age = " << this->m_Age << endl;
}
void func()
{
m_Age = 100;
cout << "func调用" << endl;
}
int m_Age;
mutable int m_A;
};
void test01()
{
const Person p1(10);
p1.m_A = 10;
p1.showPerson();
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
8 友元
8.1 全局函数作为友元函数
8.1.1 利用friend关键字让全局函数 goodGay作为本类好朋友,可以访问私有成员
8.1.2 friend void goodGay(Building * buliding);
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <string>
class Building
{
friend void goodGay(Building * buliding);
public:
Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
void goodGay( Building * buliding)
{
cout << "好基友正在访问:" << buliding->m_SittingRoom << endl;
cout << "好基友正在访问:" << buliding->m_BedRoom << endl;
}
void test01()
{
Building buliding;
goodGay(&buliding);
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
8.2 类作为友元类
8.2.1 让goodGay类作为 Building的好朋友,可以访问私有成员
8.2.2 friend class GoodGay;
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <string>
class Building
{
friend void goodGay(Building * buliding);
public:
Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
void goodGay( Building * buliding)
{
cout << "好基友正在访问:" << buliding->m_SittingRoom << endl;
cout << "好基友正在访问:" << buliding->m_BedRoom << endl;
}
void test01()
{
Building buliding;
goodGay(&buliding);
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
8.3 类中的成员函数作为友元函数
8.3.1 //让GoodGay类中的 visit成员函数作为友元
8.3.2 friend void GoodGay::visit();
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{
public:
GoodGay();
void visit();
void visit2();
Building * m_building;
};
class Building
{
friend void GoodGay::visit();
public:
Building();
string m_SittingRoom;
private:
string m_BedRoom;
};
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
this->m_building = new Building;
}
void GoodGay::visit()
{
cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;
cout << "好基友正在访问: " << this->m_building->m_BedRoom << endl;
}
void GoodGay::visit2()
{
cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;
}
void test01()
{
GoodGay gg;
gg.visit();
gg.visit2();
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}