目录
一、“.” 成员访问运算符:操作对象的 “钥匙”
“.” 用于访问类、结构体或联合体对象的成员,就像通过对象打开成员的 “大门”。
示例:
#include <iostream>
class MyClass {
public:
int memberVariable;
void memberFunction() {
std::cout << "成员函数被调用。" << std::endl;
}
};
int main() {
MyClass obj;
obj.memberVariable = 10; // 用“.”访问成员变量
std::cout << "成员变量值:" << obj.memberVariable << std::endl;
obj.memberFunction(); // 用“.”访问成员函数
return 0;
}
核心逻辑: 创建对象 obj
后,通过 “.” 直接操作其内部成员,就像用钥匙打开抽屉取物品一样直观。
二、“::” 作用域解析运算符:跨作用域的 “导航仪”
“::” 的功能更灵活,可在不同作用域中精准定位成员,解决命名冲突等问题。
1. 访问命名空间中的成员:给代码 “分区”
命名空间能避免命名冲突,“::” 用于明确调用其中的成员。
示例:
#include <iostream>
namespace MyNamespace {
void myFunction() {
std::cout << "命名空间中的函数被调用。" << std::endl;
}
}
int main() {
MyNamespace::myFunction(); // 用“::”访问命名空间成员
return 0;
}
类比: 命名空间像 “城市分区”,“::” 是地址中的 “分区名 + 街道名”,精准找到目标函数。
2. 访问类的静态成员:属于类的 “全局资源”
静态成员归属于类本身,无需对象即可通过 “::” 访问。
示例:
#include <iostream>
class MyStaticClass {
public:
static int staticVariable;
static void staticFunction() {
std::cout << "静态函数被调用,静态变量值:" << staticVariable << std::endl;
}
};
int MyStaticClass::staticVariable = 20; // 类外初始化静态变量
int main() {
MyStaticClass::staticFunction(); // 用类名+“::”调用静态函数
return 0;
}
关键: 静态成员是类的 “公共设施”,“::” 让所有代码都能直接使用它们,无需创建对象。
3. 限定全局作用域:解决同名函数的 “歧义”
当全局函数和类成员函数同名时,“::” 可明确调用全局函数。
示例:
#include <iostream>
void myGlobalFunction() { // 全局函数
std::cout << "全局函数被调用。" << std::endl;
}
class MyClass {
public:
void myGlobalFunction() { // 类成员函数
std::cout << "与全局函数同名的成员函数被调用。" << std::endl;
}
};
int main() {
::myGlobalFunction(); // 用“::”强制调用全局函数
MyClass obj;
obj.myGlobalFunction(); // 调用类成员函数
return 0;
}
作用: 避免同名函数混淆,就像在地址中用 “国家名 + 城市名” 区分重名地点。
总结:两者的核心区别
运算符 | 作用场景 | 示例用法 |
---|---|---|
“.” | 访问对象的成员 | obj.member |
“::” | 跨作用域访问(命名空间 / 静态成员 / 全局作用域) | Namespace::member Class::staticMember ::globalFunc |
理解这两个运算符的差异,能让你在 C++ 编程中更精准地操控代码,避免作用域混乱的问题~