第七章:类

一:this指针

class Stutent
{
private:
	int number;
	string name;
public:
	string name() { return name; }
};

         在上面的代码中,假设定义一个对象Stutent limei; 然后执行limei.name(),则会返回对象limei的成员变量name。成员函数name()通过this指针判断是哪个对象的name。this是一个隐式参数,是一个指向调用函数的对象的地址的指针,this的类型是Stutent * const this (注意顶层const指针的声明中解引用符号的位置)。当执行limei.name()的时候,等价于执行Student::name(&limei)。而函数部分return name 等价于return this->name。

二:类作用域和成员函数

        编译器分两步编译类,首先编译成员的声明,然后才是编译成员函数体。

三:构造函数初始值列表

        设有一个类,类名叫做Person,则下面这行代码定义了一个默认构造函数,其中=default是c++11的新标准。

Person() = default;

四:访问控制与封装

        class和struct关键字的区别就是,前者的默认访问权限是private,后者的默认权限是public

       友元函数只要在类内的声明前加上friend关键字,该函数就可以访问类的私有成员。如下所示,函数print访问了类A的私有成员。程序输出是0

class A
{
private:
	int data = 0;
public:
	friend void print(A a);
};
void print(A a) { cout << a.data; }

int main(int argc, char *argv[])
{
	A a;
	print(a);
	while (1) {}
}

 五:在类内使用类型别名

        例如下面代码中定义的类Screen,其中pos是size_type的类型别名,用typedef定义。

​
class Screen
{
public:
	typedef string::size_type pos;
	Screen();
	~Screen();
private:
	pos cursor = 0;
	pos height = 0, width = 0;
	string contents;
};

​

六:一些细节的补充

class Screen
{
public:
	typedef string::size_type pos;
	Screen() = default;
	Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht*wd, c) {}
	~Screen();
	char get() const { return contents[cursor]; }
	inline char get(pos ht, pos wd) const;
	Screen &move(pos r, pos c);
private:
	pos cursor = 0;
	pos height = 0, width = 0;
	string contents;
};

        在上面的代码中,第四行的pos是定义的类型别名;第五行要特意声明默认构造函数,因为第六行声明了带参数的构造函数会掩盖默认构造函数惹;如果函数体定义在类中,那么该函数就是内联函数,例如代码中的不带参数的get函数,当然内联函数也可以显示声明,例如带参数的get函数。

七:const成员函数也能修改成员变量吼。

class Screen
{
public:
	
	void func() const;
private:
	mutable int mute_times = 0;
};
void Screen::func() const
{
	mute_times++;
}

        这里func函数是能够修改mute_times的啦,人家毕竟有mutable修饰惹。

八:又要定义不修改成员变量的 成员函数,又希望能够返回非常量的对象引用

九:不完全类型

class A
{
public:
	A *left;
	A *right;
	A left2;
	A right2;
};

         如上代码所示,当出现名字A后,该类就相当于已经声明了,但是直到最后一个花括号结束,该类才算被定义。在这之间,类被声明但是没有被定义,称之为不完全类型。对于不完全类型,可以定义该类型的指针或者引用,但是不允许定义该类型的对象。所以left和right的定义是合法的,而left2和right2的定义是非法的。

十:头文件循环包含

        这几个链接中已经写的很明白了:

        https://blog.csdn.net/cqu20093154/article/details/48374447

        https://blog.csdn.net/wuchuanpingstone/article/details/52384933

        https://blog.csdn.net/sinat_36053757/article/details/64444556

        友元声明的作用是影响访问权限,但他不是普通意义上的声明,即如果要使用友元必须另作声明才可。

猜你喜欢

转载自blog.csdn.net/qq_25974431/article/details/86655244