定义一个这样的类是可以的(忽略它的实现):
class MyEngine {
private:
int* params;
int param_len;
public:
void set_params(int* _params, int _len);
float get_result(); // relies on `distance` member
float distance; // people can modify this
};
但是,如果使用vector
,假设它隐式包含<iterator>
which contains std::distance
,编译器如何区分std::distance
和distance
成员?(还是会在运行时导致意外崩溃?)。比如说,该函数get_result()
依赖于distance
成员值。
#include <vector>
using namespace std;
class MyEngine {
private:
vector<int> params;
public:
void set_params(int* _params, int _len);
float get_result(); // relies on `distance` member
float distance; // people can modify this
};
更新
正如人们所提到的,这using namespace std
是不好的做法;但是,仍然有人用 编写代码using namespace std
,如果我们与他们合作,使用他们的代码,是否有任何 concreate 示例可以证明 的using namespace std
严重性,特别是严重的运行错误?这,才是我真正的目的。
有一个答案,说distance
按类型区分两者。让我们试试这个片段:
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iterator>
using namespace std;
class MyEngine {
private:
vector<int> params;
float* distance; // people can modify this
int len;
public:
void setup();
};
void MyEngine::setup()
{
len = 100;
distance = (float*)malloc(sizeof(float)*len);
for(int i=0; i<len; i++) {
distance[0] = len - i;
params.push_back(len-i);
}
int num = distance(params.begin(), params.end());
printf("distance is: %d\n", num);
}
int main(){
MyEngine engine;
int len = 10;
engine.setup();
return 0;
}
其中,会导致编译错误说:
main.cpp:25:23: error: called object type 'float *' is not a function or function pointer
int num = distance(params.begin(), params.end());
~~~~~~~~^
1 error generated.
表明它不能distance
从它们的类型中区分这两者。
嗯,一个是MyEngine::distance
,另一个是std::distance
。他们是不同的名字。这就是scopes 的重点。
如果您使用不合格的名称distance
并让编译器自行解决,那只会有问题,但如果这不起作用,那将是因为所选名称的类型与您的用法不匹配,因此您的程序获胜不编译。
如果你曾经把东西放进去,std
那么名称可能会以潜在的无法诊断的方式发生冲突,这可能会导致崩溃,并且根据标准具有未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句