C++入门之类与对象(下)——static成员、友元类、外部类、匿名对象

讲述了C++的类与对象中的静态成员、友元类、内部类和匿名对象
摘要由CSDN通过智能技术生成

目录

一、类中的静态成员

1.类中static静态成员变量

从类外获取static成员

2.类中的static静态成员函数

(1) 与类中普通成员函数的区别

(2)只能创建存在在栈上的对象

二、友元

1.友元函数

(1)友元函数的含义

(2)说明

2.友元类

1.友元类含义

2.友元类特点

三、内部类

1.内部类概念

注意事项:

2.内部类特性

四、匿名对象

1.匿名对象特性

(1)匿名对象不用取名

 (2)匿名对象可初始化

 (3)匿名对象的生命周期只在其出现的那一行


一、类中的静态成员

经过长久的学习,大家都知道在C和C++中有一个static关键字,由这个关键字所修饰的变量的会被放在静态区,其生命周期为整个源程序。而static静态变量由有两个分类,分别是:局部静态变量全局静态变量。这两个变量的生命周期并无区别,唯一的区别就在于局部静态变量只能在其定义的局部范围内使用,而全局静态变量则可以在全局域使用

假设我们现在有一个类,我们要求统计这个类中所创建的对象数量,我们可以以如下方式统计:

int n = 0;
class Test
{
public:
	Test()
		:_a(0)
	{
		++n;
	}
	Test(Test& t)
	{
		++n;
	}
private:
	int _a;
};


int main()
{
	Test t1;
	cout << n << endl;
	return 0;
}

在这个程序中,我们在类的外面定义了一个n,这个n是可以在类里面使用的,我们将这个n放在类的构造和拷贝构造函数中,每调用一次就++,这样我们就可以拿到这个类创建的对象的次数。

但是这个变量n是一个全局变量,是可以被随意调用和修改的,这个n也可能会被外部的使用者无意或有意的修改,导致数据错误。因此,我们最好将这个n放在类里面。可是这也会导致一个问题:将这个变量放在类里面,这就意味着我们会对它进行初始化,每次对象调用都会对n进行一次初始化,这就会导致我们无法拿到正确的数据。为此,类中便有了静态成员变量的概念

1.类中static静态成员变量

类中的静态成员变量存储在静态区中,作用域为整个类。对于上面的那个问题,我们可以以如下方式进行解决:

但是这就有一个问题了,静态成员变量是存储在静态区的,而普通对象创建是创建在栈中的,这就意味着我们创建的对象中不会存在static成员变量。那既然对象中不会存在静态成员变量,理所当然的,构造和拷贝构造函数中就不能对static成员变量进行初始化。那么我们要在哪里对这个成员变量进行初始化呢?C++中规定,在类中的static成员变量在“类外”进行初始化

class Test
{
public:
	Test()
		:_a(0)
	{
		++_N;
	}
	Test(const Test& t)
	{
		++_N;
	}
private:
	int _a;
	static int _N;
};
int Test:: _N = 0;

这里有一点要注意,对于其他static局部或全局变量,如果我们不对其进行初始化编译器会自动将其初始化为0。而类中的static成员变量不同,我们必须要对其初始化,否则会报错。

从类外获取static成员

现在我们通过定义static成员变量的方式解决了统计创建对象个数的问题,那么我们要如何拿到它呢?首先来看如果这个static成员变量是public的

(1)假设static成员是public的

如果在类里面这个static成员变量被设置为public,那我们就可以很简单的从类外获取。

1.直接指定类域进行获取

这里可以直接指定类域进行获取

但是有没有人感到奇怪,明明外面创建的对象中并不存在static成员变量,那为什么我们依然可以通过对象的方式获取_N的值呢?

这是因为虽然对象中并不存在,但是当调用这个对象时,编译器依然会从类中去寻找数据。既然如此,那我们可以尝试一下用指针的方式能否调用_N。

2.用指针的方式获取

 可以看到,这种方式是可行的。但是假如这个指针指向nullptr呢?

依然可以正常运行。这就是因为虽然这个类指针指向空,但调用数据时依然会从类中去查找

(2)static成员是private的

1.写一个Get_N&#

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值