1. 作用域限定符
C++中的作用域解析运算符( :: )用于在全局作用域中引用局部作用域的变量或函数。
通知编译器应从作用域限定符左侧的名字所示的作用域中寻找右侧那个名字,即指定访问哪个名字空间的哪个成员。
它可以用于以下几种情况:
1、引用全局变量:如果在某个函数内部定义了与全局作用域中的变量同名的局部变量,可以使用作用域解析运算符来引用全局变量。
2、引用类的静态成员:如果在类的内部定义了静态成员变量或静态成员函数,可以使用类名加上作用域解析运算符来引用类的静态成员。
1.1 名字空间
通过作用域限定符,可以访问指定名字空间中的变量。
cout << a << endl ; // 1 就近原则
cout << ::a << endl ; // :: 是匿名名字空间 ,先找全局变量,再找其他名字空间,不会找main函数中的变量
using namespace my_space; 名字空间声明,只有当声明名字空间之后,才能去访问指定名字空间中的变量
cout << my_space::a << endl ; // 3
#include <iostream>
using namespace std;
int a = 2;
namespace my_space
{
int a = 3;
int b = 4;
}
using namespace my_space;
int main()
{
int a = 1; // 局部变量
cout << a << endl; // 就近原则
cout << ::a << endl; // 匿名名字空间
cout << my_space::a << endl; // my_space 名字空间
cout << b << endl;
return 0;
}
1.2 类内声明,类外定义
当在类里定义构造函数,在类外定义构造函数。在类外定义构造函数时,就需要加上作用域,表明这个构造函数到底是属于哪个类。
利用作用域限定符进行类内声明类外定义实例:
在类内声明无参构造函数Demo 与 构造函数 test;
在类外利用 Demo:: 进行定义。
#include <iostream>
using namespace std;
class Demo
{
public:
// 在类里定义无参函数Demo,与函数test
Demo();
void test(string str);
};
// 在类外面定义无参函数Demo,与函数test,加 Demo:: 代表是Demo类中
Demo::Demo()
{
cout << "创建了一个对象" << endl;
}
void Demo::test(string str)
{
cout << "string: " << str << endl;
}
int main()
{
// 类内声明,类外定义
Demo d;
d.test("hello");
return 0;
}
2. this 指针
2.1 类内调用成员
● 成员(变量+函数)必须由对象调用。类中成员的调用都依赖于this指针的,通常由编译器自动添加。
this->成员变量= 访问 本实例对象中的非静态成员变量 ;
this'指针实例:
Test t1("zhangsan");,调用构造函数创建对象并进行初始化赋值,
构造函数中,this->name = n; 通过this指针,指向调用的对象,也就是对对对象t1的成员变量进行赋值
#include <iostream>
using namespace std;
class Test
{
private:
string name;
public:
Test(string n)
{
// 编译器默认添加this指针,指向的对象调用成员
this->name = n;
}
string get_name()
{
return this->name;
}
};
int main()
{
Test t1("zhangsan");
cout << t1.get_name() << endl;
return 0;
}
2.2 区分重名的成员变量与局部变量
使用this指针可以明确指示当前对象的地址,可以解决对象之间的命名冲突问题,同时也方便了对对象的成员变量和成员函数的操作。
this标记的为成员变量,用来区分成员变量与函数传入的形参。
this指针区分成员变量与形参的实例:
等号左边的 this->name中的name为成员变量name;等号右边的name为传入的形参。
Test(string name)
{
// 编译器默认添加this指针,指向的对象调用成员
this->name = name;
}