繁体   English   中英

关于 C++ 中的 Scope 解析运算符的问题?

[英]question about Scope Resolution Operator in C++?

我正在学习 C++ 并且不太确定 Scope 分辨率运算符。 假设我有以下代码:代码1:

class Student {
     int no;
     int semester;
     char grade[M+1];
 public:
     void display() const;
 };

 void Student::display() const {
     cout << "Hi!" << endl;
 }

代码2:

class Student {
     int no;
     int semester;
     char grade[M+1];
 public:
     void display() const{
        cout << "Hi!" << endl;
    }
 };

如果我在它的 class 中定义 display() 有什么不同吗? 如果没有区别,那我为什么要使用scope分辨率算子呢?

有一个区别 - 如果在 class 中定义,则 function 的行为就像它被声明为inline一样。 但这没什么大不了的,编译器很可能会忽略它。 最大的区别在于,对于大型的多文件项目,如果您对 header 中定义的 function 主体进行更改,则使用您的 Z099FB995346F31C749F6E40DB0F3 的每个其他文件都将重新编译为。 然而,如果您对 a.cpp 文件中定义的 function 主体进行更改,则只需重新编译该文件。 这可以而且确实对现实世界的项目产生了巨大的影响。

scope 分辨率运算符允许您在 class 之外定义 function。
这提供了不向库的用户公开/抽象您的源代码实现的能力。 class 声明放在 header 文件中,实际定义保存在 cpp 文件中,然后只向最终用户提供 object 文件或相同的库。
您可以说它提供了一种保护知识产权的方式,尽管该功能并不是专门为它设计的。

通常你会在 header 文件中定义 class 然后在 .cpp 文件中实现它。 为了让编译器知道 function 属于哪个 class,您使用 Scope 解析运算符,即::

当您将 function 直接放在 header 中时,如示例二所示,您需要在其前面加上inline关键字,这会告诉编译器将整个 ZC1C425268E68385D1AB5074C17A94 代码放入其中。 通常,您使用非常小的函数来执行此操作,并且出于速度考虑,大量使用它会导致 exe 中的代码膨胀。

主要原因是您不想将 class 定义与各种不相关的实现细节混在一起,例如 function 的实现。 当 class 很小,只有一两个函数,而函数很小,只有一两行时,不一定有问题,但在现实生活中,将 function 定义放在 ZA2F2ED4F8EBC06AB1DZ 本身很快就会导致4不可读代码; 您希望尽可能将外部定义与内部实现分开。 (在大型项目中,它们通常由不同的人维护。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM