关于类成员指针的一些问题
一下问题都是在看C++ Primer 13.6的时候得出的问题
1.
假设有这么一个类
class Screan{
private:
short _height;
};
在外面,我可不可以这样定义
typedef short Screen::*ps_Screen;
ps_Screen pH = &Screen::_height;
书上是这么写的,但是我觉得_height是私有的,这样赋不就破坏了私有的性质,在外部就可以改变_height的值了
上边如果变成了静态的
class Screan{
public:
static short _height;
};
那么在外部定义一个指向这个数据成员的指针该怎么定义?
如果public变成了private,还可以在外部定义这么一个指针吗?
2.
class Screan{
public:
void forward();
void down();
Screan& print(???);
};
print()的参数是指向成员函数forward()或者down()的指针,那是写void (*ptr)();还是写void (Screan::*ptr)();?
书上是第二种,但是我觉得既然在同一个scope里了,不用指明作用域了吧?
然后在使用的时候,是写 object.print(Screan::down);还是object.print(down);?
[解决办法]
楼主注意一个问题:指向成员的指针必须由对象或指向对象的指针来调用
那好,下面开始
第一个问题:
私有的成员依然可以被外部定义指向成员的指针来指向,这是因为在你用这个指针调用那个成员时,要用到对象或指向对象的指针,如:
typedef short Screen::*ps_Screen;
ps_Screen pH = &Screen::_height;
Scream s;
s.pH; //这样才能调用pH指向的成员,而这时编译器就会发现,pH指向的是私有成
//员,报出编译错误,因此并不存在破坏封装的问题
第二个问题:
虽然定义在同一个类域,但是也要指明这是一个指向类的成员函数的指针.这样编译器才能给它设置偏移量
[解决办法]
在外面,我可不可以这样定义
typedef short Screen::*ps_Screen;
ps_Screen pH = &Screen::_height;
书上是这么写的,但是我觉得_height是私有的,这样赋不就破坏了私有的性质,在外部就可以改变_height的值了
==========
这只是取得它的偏移地址,真正赋值的时候还得有对象,那时候才会检查访问权限
上边如果变成了静态的
class Screan{
public:
static short _height;
};
那么在外部定义一个指向这个数据成员的指针该怎么定义?
如果public变成了private,还可以在外部定义这么一个指针吗?
==========
静态成员变量类似全局变量
short* p = &Screan::_height;
如果是private,那就不能在外部定义这么一个指针,因为没有访问权限
然后在使用的时候,是写 object.print(Screan::down);还是object.print(down);?
======
应该写成
object.print(&Screan::down)