# -1.VS使用类的一个骚操作
创建一个头文件后,我们把类塞进去,类里面的任意成员函数单击选中点“快速操作和重构”即可将该函数的使用整到另一个cpp*文件中去,我们即可在cpp*文件中对该函数展开来写,这样就可以让类的内部整洁一些。
# 0.默认构造函数没有返回值
# 1.默认构造参数的问题
BOX();
BOX(int a,int b,int c);
//这种写法一点问题没有
BOX();
BOX(int a=1,int b=1,int c=1);
//这种写法有问题,因为给每个参数默认值实际上相当于默认构造函数。
# 2.默认构造函数内部调用
BOX(int a,int b,int c);
BOX():BOX(2, 4, 6) { std::cout << "hello class!" << std::endl; } ;
无参默认函数调用有参默认函数,{ std::cout << "hello class!" << std::endl; }是无参默认函数的功能
# 3.类对象的复制
BOX MyBOX;
BOX MyBOX2{ MyBOX };
采用这种形式进行对MyBOX2进行复制时,则不再对其进行初始化,也就是不在调用构造函数
# 4.访问私有成员(其实很简单,但还是写一下)
利用类的公有区域可以调用私有成员的特性,写个函数即可,比如:
int diaoyong() { return a; };
# 5.一个类里面专属的东西,"this"
this是一个关键字,它指向当前的对象,比如说我调用MyBOX(),其实在调用的时候就有这个this
先讲一个引例:
{
private:
int a=1;
int b=2;
int c=3;
public:
BOX();
~BOX();
int volumn()
{
return this->a * this->b * this->c;
}
};
int main()
{
BOX TEST;
std::cout<<TEST.volumn()<<std::endl;
}
//这个this在我们使用TEST.volumn的时候就等效于TEST的地址
来一个进阶例子:
先看类的文件:
#include <iostream>
class BOX
{
public:
BOX(int a,int b,int c);
BOX():BOX(2, 4, 6) { std::cout << "hello class!" << std::endl; } ;
//构造函数
~BOX();
//析构函数
int volumn()
{
return a * b * c;
}
BOX* geta(int a1);
BOX* getb(int b1);
BOX* getc(int c1);
private:
int a{ 1 };
int b{ 2 };
int c{ 3 };
};
再看类的函数定义的文件:
#include "HTEST.h"
BOX::BOX(int a1, int b1, int c1)
{
std::cout << "CLASS NUMBER INIT!" << std::endl;
a = a1;
b = b1;
c = c1;
}
BOX::~BOX()
{
}
BOX* BOX::geta(int a1)
{
a = a1;
return this;
}
BOX* BOX::getb(int b1)
{
b = b1;
return this;
}
BOX* BOX::getc(int c1)
{
c = c1;
return this;
}
最后看实现的文件:
#include "HTEST.h"
int main()
{
BOX MyBOX;
std::cout << MyBOX.geta(2)->getb(3)->getc(4) << std::endl;
std::cout << MyBOX.volumn() << std::endl;
return 0;
}
运行结果:
CLASS NUMBER INIT!
hello class!
0000009C6C6FF768
24
分析:最开始是两个初始化,无参调用有参,有参初始化的内容弹出来后又弹了无参,刚才有写
第三个弹出来的明显是一段地址,我们看主函数的第二行,和类定义文件中的内容,发现我让他返回了一些this,而大家再看类文件,发现定义的类型是BOX*。刚才已经说过,this代表当前使用对象的地址或者说指针,那么我相同的地址其实也就相当于我这个对象的指针,理所当然的可以继续调用我这个对象里面的函数,最后我不在调用更多,但仍然返回了我这个对象的地址,这就是0000009C6C6FF768出现的原因!大家可以把我的代码粘贴走试验下。
24是因为我调用这三个函数的过程中给a,b,c都赋值了,调用了一下volunm函数计算出了24这个结果。
还是不明白直接联系我!
# 6.友元函数
不分公有、私有、保护进行访问
在被友元的类的部分声明:friend int test(const BOX& a)//参数就是初始化的对象
使用:test(对象)
注意:test不属于类成员
# 7.友元类
在被友元的类的部分声明:friend class DADONG;
# 8.静态变量
定义在类的公有区域:static inline int count{};
把count++扔到类的某个函数中就可以知道整个程序带哦用该函数多少次;