什么时候使用"::",什么时候使用"."
什么时候使用"::",什么时候使用"."
这个问题已经有答案了:
很抱歉我想这是非常基本的问题。
我在网上找不到运算符::和.在C ++中的区别。
我有几年的C#和Java经验,并熟悉使用.运算符访问成员的概念。
有人可以解释一下这些何时使用以及区别是什么吗?
感谢您的时间。
admin 更改状态以发布 2023年5月24日
在C++中,::
是作用域解析运算符,用于区分命名空间和静态方法,基本上任何没有对象的情况。而.
用于访问对象内的东西。
C#对于这两个都使用.
运算符。
namespace Foo { public class Bar { public void Method() { } public static void Instance() { } } }
在C#中你会这样写代码:
var blah = new Foo.Bar(); blah.Method();
但等价的C++代码会看起来更像:
Foo::Bar blah; blah.Method();
但请注意,静态方法也将使用作用域解析运算符访问,因为您没有引用对象。
Foo::Bar::Instance();
在这种情况下,C#代码仍然只使用(.)运算符。
Foo.Bar.Instance();
它们的不同是,第一个是作用域解析运算符,第二个是成员访问语法。
所以, ::
(作用域解析运算符)可以用于访问命名空间中更深层次的东西,比如嵌套类,或访问静态函数。而 .
(点号) 运算符则可以方便地访问你正在使用的类实例中的任何可见成员。
这里有一些例子:
class A { public: class B { }; static void foo() {} void bar() {} }; //Create instance of nested class B. A::B myB; //Call normal function on instance of A. A a; a.bar(); //Call the static function on the class (rather than on an instance of the class). A::foo();
需要注意的是,静态函数或数据成员是属于类本身的,无论你是否创建了该类的任何实例。因此,如果我有一个类中的静态变量,并创建了一千个该类的实例,仍然只有一个该静态变量的实例。但对于不是静态的任何其他成员,每个类实例都有自己的实例。
在更高级的用法中,还有一个有趣的选项 🙂 你还会看到:
//Create a pointer to a dynamically allocated A. A* a = new A(); //Invoke/call bar through the pointer. a->bar(); //Free the memory!!! delete a;
如果你还没有学过动态内存分配,它可能会更加令人困惑,所以我不会深入讲解。只是想让你知道,你可以使用 { ::
或 .
或 ->
} 访问成员 🙂