看到深度探索C++对象模型3.2节,其中给出了一个判断access section出现先后顺序的模板函数如下:
template<class class_type,class data_type1,class data_type2>
char* access_order( data_type1 class_type::* mem1,data_type2 class_type::* mem2){
assert(mem1 != mem2);
return mem1 < mem2 ? "member1 first" : " member2 first";
}
用以下程序测试
class Point3d{
public:
float x;
static list<Point3d*> *freeList;
public:
float y;
static const int chunkSize = 250;
public:
float z;
};
int main(){
access_order( &Point3d::z,&Point3d::y);
return 0;
}
得到的是: '<' : illegal, right operand has type 'float Point3d::* '也就是说这里类成员指针的用法不合法。至于为什么会这样,我推测可能是“ < ”没有以 类成员指针为参数的操作符重载。
类似的问题也发生在ostream上面。例如以刚才定义的Point3d类为基础,做一下测试
int main(){
cout<< &Point3d::x<<","<<&Point3d::y
<<","<< &Point3d::z <<endl;
}
输出结果为1,1,1,而不是正确的偏移地址。究其原因,应该是ostream对象没有重载类成员指针的参数,故不能正确输出偏移地址。而在VC下用<<输出中如果遇到不认识的类型,只要参数合法总输出1。
将上面的测试程序改变成一下程序便可以正确输出类中数据成员的偏移地址
int main(){
printf("%p\n",&Point3d::x );
printf("%p\n",&Point3d::y );
printf("%p\n",&Point3d::z );
return 0;
}
输出如下:
或者用如下测试程序也会输出相同结果:
int main(){
cout<<&((Point3d*)0)->x<<endl; //将0强制转化为Point3d指针,
cout<<&((Point3d*)0)->y<<endl; //然后去类成员便是他们的偏移地址
cout<<&((Point3d*)0)->z<<endl;
}
此外:由于目前的编译器的性质,可以用类成员指针来计算出相应类实例的大小:计算出最后一个数据成员的偏移量加上最后一个数据成员类型所占用的内存空间。
总结:
1.类成员指针不能做某些操作符的参数,如<和<<操作符
2.类成员指针是其相应成员的偏移地址
3.可以用类成员指针计算出类实例的大小
分享到:
相关推荐
下面给出一个使用指向类成员指针的例子: #include class A { public: A(int i) { a=i; } int fun(int b) { return a*c+b; } int c; private: int a; }; void main() { A x(8); //定义类A的一个...
1.普通函数指针指向普通函数 2.普通函数指向非静态成员函数 3. 类外部的 类函数指针 指向...4. 类外部的 类函数指针 指向成员函数 5. 类内部的 函数指针 指向成员函数 (类似于第2条) 6. 类内部的 函数指针 指向普通函数
在C++中,函数指针一般是指全局命名空间中的函数指针,类成员函数指针,与函数指针不同的是,类具有类域操作符,在声明类成员函数指针的时候,要指定成员函数返回值类型、类域操作符、成员函数参数列表
C++中一般函数指针和类的成员函数指针的区别
类中的静态(static)成员变量,成员函数;const(常量)成员变量,成员函数和const 对象;const static(常量静态)数据成员;对象数组;...类成员指针;嵌套类;友元;this 指针以及.*和->*运算符共12 种内容。
指向类的静态成员的指针,通过指针访问类的静态数据成员
C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的...
由于这几天在开发中要用到函数指针,所以就整理了一下关于函数指针的概念
使用这个类的时候,只需要提供染色体总数、最大进化代数、最优染色体在迭代的时候复制个数、计量适应度函数指针(支持类成员指针)。 测试文件test.cpp中的第15行和第35行,"==1"改成"==true",这是个bug,已经传了...
指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍: 一、指向类的普通成员的指针(非静态) 1、指向类成员函数的指针 简单的讲,指向类成员...
学会在类中使用指针,包括类中有指针(数组)数据成员、指向对象的指针、指向数据成员的指针、指向成员函数的指针
博文地址:https://blog.csdn.net/maoyeahcom/article/details/107106680
21.11 类成员指针(.和—>) 21.12 多重继承与virtual基类 21.13 结束语 小结 术语 自测练习 自测练习答案 练习 附录A 运算符的优先级与结台律 附录B ASCII字符集 附录C 数值系统 附录D 有关C++的Internet与Web...
本介绍怎样operater+()重载类的char*型成员变量。
在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换...C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数。
由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。 1、指向一般函数的指针函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数...
c++ 成员函数指针,使用非常方便,采用vs2005开发环境
在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存。在<<c>> 中写到,如果一个类需要我们自己...
对于指向类成员的指针,必须紧记,指向类成员(非static)的指针并非指针
易语言从外部取类成员源码,从外部取类成员,方法1,方法2,方法3,类成员整数型测试,类成员文本型测试,写入类成员数值,读取类成员数值,指针到整数_,Call,Call_