什么时候使用"::",什么时候使用"."

15 浏览
0 Comments

什么时候使用"::",什么时候使用"."

这个问题已经有答案了

在C ++中引用类成员时,何时使用点、箭头或双冒号?

很抱歉我想这是非常基本的问题。

我在网上找不到运算符::和.在C ++中的区别。

我有几年的C#和Java经验,并熟悉使用.运算符访问成员的概念。

有人可以解释一下这些何时使用以及区别是什么吗?

感谢您的时间。

admin 更改状态以发布 2023年5月24日
0
0 Comments

在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();

0
0 Comments

它们的不同是,第一个是作用域解析运算符,第二个是成员访问语法。

所以, ::(作用域解析运算符)可以用于访问命名空间中更深层次的东西,比如嵌套类,或访问静态函数。而 . (点号) 运算符则可以方便地访问你正在使用的类实例中的任何可见成员。

这里有一些例子:

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;

如果你还没有学过动态内存分配,它可能会更加令人困惑,所以我不会深入讲解。只是想让你知道,你可以使用 { ::.-> } 访问成员 🙂

0