《深度探索C++对象模型》第三章“Data语意学”
3.1 The Binding of a Data Member
下面一段代码的输出是什么?
[xiaochu.yh@OceanBase cpp]$ cat member_binding.cpp
#include <iostream>
using namespace std;
typedef int len_t;
class Point
{
public:
void mum(len_t val) { _val = val; cout << _val << endl; }
private:
typedef float len_t;
len_t _val;
};
int main()
{
Point p;
p.mum(123.3);
return 0;
}
那么下面一段代码呢?
[xiaochu.yh@OceanBase cpp]$ cat member_binding.cpp
#include <iostream>
using namespace std;
typedef int len_t;
class Point2
{
private:
typedef float len_t;
public:
void mum(len_t val) { _val = val; cout << _val << endl; }
private:
len_t _val;
};
int main()
{
Point2 p2;
p2.mum(123.3);
return 0;
}
答案是:123.3
从上面的案例中可以知道,作为一种防御性编程风格,建议把类体中的typedef放在最前面,如例2中所示。
还看最后一段代码,会是什么输出呢?
[xiaochu.yh@OceanBase cpp]$ cat member_binding.cpp
#include <iostream>
using namespace std;
class Point
{
public:
void mum(len_t val) { _val = val; cout << _val << endl; }
private:
typedef float len_t;
len_t _val;
};
int main()
{
Point p;
p.mum(123.3);
return 0;
}
member_binding.cpp:7: error: ‘len_t’ has not been declared