Arr*_*row 5 c++ static-methods
假设您有以下课程:
struct Foo {
static void print(std::string x) { std::cout << x << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)
是什么调用之间的区别print一样
Foo foo; //Or a pointer...
foo.print("Hello world");
Run Code Online (Sandbox Code Playgroud)
和
Foo::print("Hello world");
Run Code Online (Sandbox Code Playgroud)
?
在打电话方面没有区别.这是六个中的六个,另外六个.
Foo::print("Hello world");更惯用 ; 公约已经长大,其中这个信号告诉读者print是有可能成为一个static功能.为此,foo.print("Hello world");在您的特定情况下使用是特殊的,因此令人困惑.因此,请避免这种情况,特别是如果引入不必要的实例会产生开销foo.
请注意,如果要print在复杂类层次结构中的另一个方法中达到特定的覆盖,也可以使用使用范围解析运算符的表示法!因此我可能在上面使用.
第一个版本必须构建和破坏一个明显的区别Foo.
然后有明显的相似之处在于两个版本在执行函数调用时都会执行相同的操作(构造字符串,打印等).
不太明显的区别在于评估两个表达式.你看,即使foo调用不需要,它仍然作为表达式的一部分进行评估:
可以使用qualified-id表达式X :: s来引用类X的静态成员; 没有必要使用类成员访问语法来引用静态成员.可以使用类成员访问语法来引用静态成员,在这种情况下,评估对象表达式.
在你的情况下,这并不意味着什么.但在某些情况下,它可能会阻止您的程序编译.例如,如果foo是constexpr函数中的引用参数.
| 归档时间: |
|
| 查看次数: |
2163 次 |
| 最近记录: |