一、类成员指针

1.概念

类成员指针指向的是类的非static成员,因为类的static成员是所有类对象共有,所以static成员的指针和普通指针没有区别

2.成员变量指针

示例

class test
{
public:test(){}~test(){}int pub;private:int pri;
};int main(int argc, char const *argv[])
{int test::*pi=&test::pub;test t;t.*pi=10;cout<<t.pub<<endl;return 0;
}

上述代码中pi就是个test的成员变量指针,成员变量指针的读法依旧是从右到左,首先*pi知道pi是个指针,::test知道该指针指向test对象中的成员,int表明该指针指向test对象中的int成员

因为成员变量指针是个指针,解引用需要用*,但是该指针又指向某个类的成员变量。所以不能直接解引用类成员指针,必须用类的对象,指针或者引用访问该成员变量指针解引用出来的成员变量

如果把t.*pi=10;写成*pi,将会出错

提示解引用无效,因为没有指定访问该解引用的类的对象,指针或者引用

成员变量有访问权限,所以,成员变量的指针也受访问权限修饰符的影响,上述代码中,不能在主函数中让一个成员变量指针指向&test::pri,因为pri是private的,否则会出现如下错误

对于私有的成员变量指针,只能在类的成员和友元中使用

因为成员变量一般是私有的,所以一般不能直接获取成员指针,需要一个返回成员指针的函数

示例

class test
{
public:test(){}~test(){}int pub;int test::*funcpri();private:int pri;
};int test::*test::funcpri()//返回一个成员变量指针的函数
{return &test::pri;
}int main(int argc, char const *argv[])
{test t;int test::*p=t.funcpri();t.*p=10;cout<<t.*t.funcpri()<<endl;//打印对象t的pri成员return 0;
}

3.成员函数指针

成员函数指针用的比较多的就是用作Qt的信号槽,和成员变量指针、函数指针类似

示例

connect(pstartbtn_, &QPushButton::pressed, this, &MainWindow::onstartbtnclicked);
connect(pkeyboardbtn_, &QPushButton::pressed, this, &MainWindow::onkeyboardclicked);

上述代码中,connect的第2个和第4个参数就是成员函数指针,成员函数不能自动转化为成员函数指针,所以必须在成员函数前加上&,得到的才是成员函数指针

和成员变量一样,因为成员函数指针是个指针,解引用需要用*,但是该指针又指向某个类的成员函数。所以不能直接解引用类的成员函数指针

必须用类的对象,指针或者引用访问该成员函数指针解引用出来的成员函数

示例

class test
{
public:test(){}~test(){}void func() const{};
};int main(int argc, char const *argv[])
{test t;void (test::*pf)() const=&test::func;(t.*pf)();return 0;
}

上述代码中第12行中,(test::*pf)中的括号和后面的const必不可少

此外。13行中的(t.*pf)();不能写成t.*pf();当把括号去掉后,编译器就认为要调用一个名字叫pf的成员函数,然而pf并不是成员函数,于是报错

成员函数有访问权限,所以,成员函数的指针也受访问权限修饰符的影响,同成员变量

想通过成员函数指针进行函数调用,必须通过将该成员函数指针绑定到特定的对象、指针或引用上。所以,单独的成员函数指针并不是可调用对象,所以,不能直接将单独的成员函数指针作为实参传入一个函数

示例

int main(int argc, char const *argv[])
{vector<string> vstr={"123", "456", "789"};bool (string::*p)() const= &string::empty;find_if(vstr.begin(), vstr.end(), p);return 0;
}

所以,当使用函数指针作为参数时,不要把成员函数指针当做实参,因为成员函数指针不可调用

二、嵌套类

顾名思义就是一个类定义在另一个类的内部。嵌套类的名字只在外层类中可见,在其他地方不可见。虽然嵌套类在另一个类中定义,但是和外层类没有任何关系,只不过作用域仅限于外层类

示例

class one
{
public:one(){}~one(){}class two{public:two(){}~two(){}void func2();int twomem;};
};void one::two::func2() {}
int main(int argc, char const *argv[])
{//two t;//one t;//t.func2();return 0;
}

two是one的嵌套类,当实现two中的func2时,func2的作用域也是从外到内一层一层写。因为two的作用域仅限于one,所以20行的代码是错误的,因为one和two没有任何关系,所以2122行的代码是错误的

因为嵌套类的作用域仅限于外层类。所以,嵌套类一般用于外层类的实现

三、union

union有多个数据成员,但是这些数据共用内存,同一时刻只有一个成员有值

union在嵌入式开发中非常常用,经常和char数据一起使用,用来定义收发数据的数据格式

示例

union uploaddata
{unsigned char buffer[20];struct sensorstr{unsigned int Header;float X_speed;float Y_speed;float Z_speed;unsigned char End_flag;}sensordata;
};

union中buffer的大小正好就是sizeof(sensordata),buffer和sensordata共用一块内存,当收到buffer中的数据时,可以通过struct对buffer中的数据进行解析,当发送数据时,也可以通过对struct的成员进行赋值,然后将buffer发送出去

参考

《C++ Primer》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++知识点杂记2——类成员指针、嵌套类和union相关推荐

  1. C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C

    C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...

  2. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  3. java 嵌套类 继承_Java嵌套类 - 爱吃苹果的搬运工的个人空间 - OSCHINA - 中文开源技术交流社区...

    在Java中可以创建几种不同类型的嵌套类: 静态嵌套类: 静态内部类可以独立于外部类被实例化,无法访问外部类中的非静态属性和方法,只能外部类的实例来访问外部类的非静态变量 public class O ...

  4. 不同派生方式下基类成员在派生类中的可访问范围属性

    不同派生方式下基类成员在派生类中的可访问范围属性 派生方式 派生方式 派生方式 基类成员 公有派生 私有派生 保护派生 私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护 公有成员 公 ...

  5. C++改变基类成员在派生类中的访问属性

    使用using声明可以改变基类成员在派生类中的访问属性.我们知道基类的公有成员经过公有继承,在派生类中其属性为public的,但是通过using 声明,我们可以将其改为private或protecte ...

  6. C++中public/private/protected三种继承方式下基类成员对派生类的可见性探讨

     原文: http://blog.csdn.net/zgjxwl/article/details/4804233 1.public继承方式下 #include <iostream>   ...

  7. 37、C++ Primer 4th笔记,特殊工具与技术,类成员指针

    1.成员指针(pointer to member)包含类的类型以及成员的类型.成员指针只应用于类的非static成员.static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员 ...

  8. C++ Primer 5th笔记(chap 19 特殊工具与技术)类成员指针

    1. 成员指针( pointer to member) 指可以指向类的非静态成员的指针. 成员指针指示的是类的成员, 而非类的对象. 类的静态成员不属于任何对象, 因此无须特殊的指向静态成员的指针 指 ...

  9. java 嵌套类 作用_java 嵌套类的分类、为什么使用嵌套类?

    java程序语言允许你在一个类里面再声明另一个类,这样的类成为嵌套类,说明如下:class OuterClass { ... class NestedClass { ... } } 术语:嵌套类分为两 ...

最新文章

  1. Dotfuscator代码混淆工具的使用
  2. 计算机视觉的数据增广技术大盘点!附涨点神器,已开源!
  3. jQuery用于请求服务器的函数
  4. 殊途同归!招聘软件与社交软件最终都要走向约P宿命?
  5. STL常用容器大致对比
  6. 2018.12.30|区块链技术头条
  7. informix报错244_关于informix的配置问题
  8. LeetCode 965单值二叉树-简单
  9. 牛客16654 谁拿了最多奖学金
  10. CocoaPods pod install
  11. 正态分布、t分布、卡方分布、F分布的关系与差异
  12. EINT、DINT、ERTM、DRTM和INTM、DBGM解析
  13. 分享一篇投稿英文期刊该如何回复审稿人的文章
  14. NOTION 换深色背景 黑色背景
  15. 3.11 污点和容忍度
  16. docker mysql 高可用_docker搭建数据库高可用方案PXC
  17. python import变灰_pycharm中import呈现灰色原因的解决方法
  18. 音乐发烧友私藏!这里有一份端午浓情大礼包!
  19. C4D无法修改参数?所有参数都是灰色无法修改?
  20. arcgis导入坐标点转面_ArcGIS学习记录—Arcgis中点、线、面的相互转换方法

热门文章

  1. springcloud(三):服务提供与调用
  2. mysql返回记录的ROWNUM(转)
  3. opengles2.0 帧缓存对象(FBO)
  4. 了解了解一下SQLSERVER里的鬼影记录
  5. DELL服务器重做RAID
  6. Notes客户端重新配置批处理
  7. ***正传——著名网络安全人士郭鑫成长经历
  8. pycharm中python解释器的配置
  9. 机器学习基础专题:感知机
  10. android selector下的设置背景属性值