第七章:类

一: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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值