数据成员绑定时机
1. 类成员变量的绑定时机
编译器对成员函数myfunc的解析,是整个类A定义完毕后才开始的。所以,对这个myvar的解析和绑定,是在这个类定义完成后发生的。
myvar的查找顺序:
- 先在类A中查找,没有查找到才去其他地方查找。
#include<iostream>
using namespace std;
string myvar;
class A {
public:
int myfunc();
public:
int myvar; //还有一个全局的
};
int A::myfunc() {
cout<<myvar<<endl;
return myvar;
}
int main()
{
A objA;
objA.myvar = 15;
objA.myfunc();
}
myvar使用的还是类A的,而不是全局的。
2. 类带有typedef的数据绑定
#include<iostream>
using namespace std;
typedef string mytype;
class A {
public:
private:
typedef int mytype;
mytype m_value; //此时m_value是int类型
};
#include<iostream>
using namespace std;
typedef string mytype;
class A {
public:
private:
mytype m_value; //此时m_value是string类型 下面的这个typedef此时看不到
typedef int mytype;
};
#include<iostream>
using namespace std;
typedef string mytype;
class A {
public:
void myfunc(mytype other) { //other是string类型
m_value = other; //会出错
}
private:
typedef int mytype;
mytype m_value; //此时m_value是int类型
};
#include<iostream>
using namespace std;
typedef string mytype;
class A {
public:
void myfunc(mytype other); //other是string类型
private:
typedef int mytype;
mytype m_value; //此时m_value是int类型
};
void A::myfunc(mytype other) { //other是int类型
m_value = other; //会出错
}
void myfunc(mytype other) { //other是string类型
mytype value; //value是string类型
value = other; //OK
}
int main()
{
}
标准做法:
#include<iostream>
using namespace std;
typedef string mytype;
class A {
typedef int mytype; // 尽量每次类中的typedef都放在开头
public:
void myfunc(mytype other); //other是int类型
private:
mytype m_value; //此时m_value是int类型
};
void A::myfunc(mytype other) { //other是int类型
m_value = other; //OK
}
void myfunc(mytype other) { //other是string类型
mytype value; //value是string类型
value = other; //OK
}
int main()
{
}