可访问性控制是编译器技术还是运行时的技术?解决办法
可访问性控制是编译器技术还是运行时的技术?
今天看Exceptional C++ Style,看到一个例子。
class A;
typedef int(A::* funp) (int);
class A
{
public :
funp Get()
{
return &A::add ;
}
private:
int add(int d)
{
++d;
cout < < "in add value = " < <d < < '\n ';
return d;
}
};
int main()
{
A a;
funp p;
p = a.Get ();
(a.*p)(1);
return 1;
}
另外,如果这样写
class B
{
public:
int GetV()
{
return v;
}
private:
int v;
};
int main()
{
B b;
cout < <b.GetV ();
return 1;
}
那么B::GetV应该会被编译器做成内联函数,而内联函数的实质就是替换代码。
那么编译器替换之后的代码就是
cout < <b.v;
而v是不可访问的。所以我就猜测,是不是可访问性控制是一种编译时,由编译器实现的技术。
我对C++学的还不够透,所以不明白这个问题。
------解决方案--------------------
C++语言中的是编译期技术。
今天看Exceptional C++ Style,看到一个例子。
class A;
typedef int(A::* funp) (int);
class A
{
public :
funp Get()
{
return &A::add ;
}
private:
int add(int d)
{
++d;
cout < < "in add value = " < <d < < '\n ';
return d;
}
};
int main()
{
A a;
funp p;
p = a.Get ();
(a.*p)(1);
return 1;
}
另外,如果这样写
class B
{
public:
int GetV()
{
return v;
}
private:
int v;
};
int main()
{
B b;
cout < <b.GetV ();
return 1;
}
那么B::GetV应该会被编译器做成内联函数,而内联函数的实质就是替换代码。
那么编译器替换之后的代码就是
cout < <b.v;
而v是不可访问的。所以我就猜测,是不是可访问性控制是一种编译时,由编译器实现的技术。
我对C++学的还不够透,所以不明白这个问题。
------解决方案--------------------
C++语言中的是编译期技术。