C++中作用域符号的使用

开发环境:Microsoft VS2017。

前言

::运算符,是作用域运算符,是C++语言中优先级最高的运算符。该运算符的用法主要有包括以下三个方面:

  1. 代码块的作用域。
  2. 类的静态成员访问。
  3. 命名空间成员访问。

代码块的作用域

在函数内如果有一个与全局变量重名的变量,可以用 ::a 的形式访问(a是全局变量名)。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int a = 1;

int main()
{
int a = 2;
cout << "这个a是局部变量: a = " << a << endl;
cout << "这个a是全局变量: a = " << ::a << endl;
system("pause");
return 0;
}

程序运行结果如下:
01

类的静态成员访问

类的静态成员变量访问

  1. 静态成员变量属于整个类所有。因为静态成员变量并不属于某个对象,所以我们可以通过类名来直接访问公有静态成员变量。也可以通过对象名访问公有成员变量。

  2. 静态成员变量的特性与全局变量相同。静态成员变量实际在类外单独分配空间,在程序内部存储于全局数据区;静态成员变量的生命期为程序运行期,不依赖于任何对象。

  3. 在定义时直接通过static关键字修饰。静态成员变量需要在类外进行赋值,不能在构造函数中进行赋值。

pch.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef PCH_H
#define PCH_H

class MyClass
{
public:
MyClass();
~MyClass();
int a;
static int b;
static int funcTest();
private:

};

#endif //PCH_H

pch.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "pch.h"
#include <iostream>
using namespace std;

int MyClass::funcTest() {
cout << "这是MyClass类中的一个静态函数" << endl;
return 1;
}

MyClass::MyClass()
{
}

MyClass::~MyClass()
{
}

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "pch.h"
#include <iostream>
using namespace std;
int a = 1;

int MyClass::b = 3;

int main()
{
int a = 2;
cout << "这个a是局部变量: a = " << a << endl;
cout << "这个a是全局变量: a = " << ::a << endl;
MyClass obj;
//int MyClass::b = 3; //error!
cout << "直接调用类中的静态成员变量MyClass::b: b = " << MyClass::b << endl;
cout << "通过类定义的对象来访问静态成员变量: b = " << obj.b << endl;
obj.b = a;
cout << "通过类定义的对象来 修改 静态成员变量的值: b = " << obj.b << endl;
cout << "直接调用类中的静态成员变量MyClass::b: b = " << MyClass::b << endl;
MyClass::b = ::a;
cout << "通过类定义的对象来访问静态成员变量的值: b = " << obj.b << endl;
cout << "直接调用类中的静态成员变量MyClass::b: b = " << MyClass::b << endl;
system("pause");
return 0;
}

说明:

1.Q:第6行的程序为什么要在全局声明?

A:静态成员变量是在类外进行初始化的,静态成员变量一定要类外进行声明。这是因为声明描述了如何分配内存,但并不分配内存。这是因为静态类成员是单独存储的,而不是对象的组成部分,所以不是在创建类对象时被定义的,因此不能在类中进行初始化,否则每创建一个对象都会初始化静态成员了。

2.注意使用::来改变作用域会同时改变掉类定义的对象中的该静态成员变量值。

程序运行结果

02

类的静态成员函数访问

静态成员函数是类中的特殊的成员函数。属于属于整个类所有。因为静态成员函数并不属于某个对象,所以我们可以通过类名来直接访问公有静态成员函数。也可以通过对象名访问公有成员函数。

main.cpp

pch.h和pch.cpp同上节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "pch.h"
#include <iostream>
using namespace std;
int a = 1;

int MyClass::b = 3;

int main()
{
MyClass obj;
cout << "\n通过作用域直接访问静态成员函数:" << endl;
MyClass::funcTest();
cout << "\n通过类定义的对象访问静态成员函数:" << endl;
obj.funcTest();
system("pause");
return 0;
}

注意:在静态函数中不能访问非静态成员变量,例如在上述funcTest()函数中,是不能直接调用类中的成员变量a的,但是可以直接访问类中的静态成员变量b。

程序运行结果

03

命名空间成员访问

访问命名空间中的成员时,要用 namespace_name::member_name 的方式访问。当然,也可以用 using 关键字省去命名空间名和作用域运算符。如上节的main.cpp程序中,给出第3行的程序,在接下来的程序中直接使用cout即可,如果没有该声明,则需要写为std::cout才可以。

参考

C++的运算符(一)—— ::(作用域运算符)

对象和类——类的静态成员

------ 本文结束感谢您的阅读------
Donate a cup of cola?