一,编译器对 成员函数 的解析,是在整个class定义完毕后才开始的。对于成员变量的解析,也是在整个class定义完成后才开始的
这个怎么理解呢?就是当编译器解析完整个class Teacher的时候,才会对成员变量和成员函数进行解析。
顺序是这样的
//编译器成员成员函数getage()的解析,肯定是在整个Teacher类定义完毕后才开始的。
//那么当在解析getAge()的时候,看到要return 一个myvar
//编译器会先在Teacher的getAge()方法内部查找这个 int 类型的myvar。
//如果找不到会在Teacher这个类中查找这个 int 的 myvar
//如果还是找不到,则会找Teacher 类外的 int的myvar。
string myvar;//全局变量,字符串类型
class Teacher {
public:
int getAge() {
//string myvar = "nihao";
int myvar = 90;
return myvar;//和全部变量名字相同,但是类型不同
}
int getAge2() {
return myvar; //这个返回的是类成员变量myvar
}
int getAge3();//将类方法实现写在类外边,如果还是return myvar,返回的myvar也是类内部的myvar
string getAge4() {
//如果想要返回的是全局变量的myvar,需要在变量前面加上 ::
return ::myvar;
}
private:
public:
int myvar;
};
int Teacher::getAge3() {
return myvar;
}
//全局函数,返回值会优先从全局变量中找
string getAge() {
return myvar;
}
void main01()
{
//编译器成员成员函数getage()的解析,肯定是在整个Teacher类定义完毕后才开始的。
//那么当在解析getAge()的时候,看到要return 一个myvar
//编译器会先在Teacher的getAge()方法内部查找这个 int 类型的myvar。
//如果找不到会在Teacher这个类中查找这个 int 的 myvar
//如果还是找不到,则会找Teacher 类外的 int的myvar。
std::cout << "Hello World!\n";
myvar = "nihao";
Teacher tea;
tea.myvar = 88;
cout << tea.getAge() << endl; //90
cout << tea.getAge2() << endl; //88
cout << tea.getAge3() << endl; //88
cout << tea.getAge4() << endl;//nihao
cout<< getAge() << endl;
//总结:编译器对 成员函数 的解析,是在整个class定义完毕后才开始的。
}
二,编译器对于 成员函数的参数的解析,是在第一次遇到这个变量类型的时候就开始的,对比一的不同,
结合一和二得到的结论:为了在类中尽早的看到类型mytype,一定要将这种类型定义语句,放在类的最开头定义。。
这样后边的成员函数第一次遇到这个类型mytype的时候,它就会按照就近原则来应用这个类型
//编译器对于 成员函数参数 的解析:是在编译器第一个遇到这个类型的时候决定的。
typedef string mytype;
class Teacher2 {
public:
void func1(mytype value1) {//当遇到这个成员函数参数的时候,由于在之前定义过typedef string mytype;,因此这时候value1会被认为是string类型
value1 = "zhangsan";
}
void func4(mytype value4);//这里也会认为mytype 是string 类型
typedef int mytype;//注意这里,还类的内部还定一个 类型,mytype为int,
void func2(mytype value2) {//当再次遇见 成员函数参数 mytype的时候,会认为是 int(按照就近原则)
value2 = 10;
}
void func3(mytype value3);
};
void Teacher2::func3(mytype value3) {
value3 = 999;
}
//注意这里,mytype会被认为是 int 类型,但是在定义的时候mytype又是string类型,因此有build error
//void Teacher2::func4(mytype value4) {
//
//}
//改法
void Teacher2::func4(::mytype value4) {
value4 = "nnji";
}
void main() {
Teacher2 tea;
string s1 = "lisi";
tea.func1(s1);
int a = 0;
tea.func2(a);
int b = 10000;
tea.func3(b);
string s2 = "wangwu";
tea.func4(s2);
}
224

被折叠的 条评论
为什么被折叠?



