C++知识点杂记2——类成员指针、嵌套类和union
一、类成员指针
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相关推荐
- C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C
C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...
- C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)
1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...
- java 嵌套类 继承_Java嵌套类 - 爱吃苹果的搬运工的个人空间 - OSCHINA - 中文开源技术交流社区...
在Java中可以创建几种不同类型的嵌套类: 静态嵌套类: 静态内部类可以独立于外部类被实例化,无法访问外部类中的非静态属性和方法,只能外部类的实例来访问外部类的非静态变量 public class O ...
- 不同派生方式下基类成员在派生类中的可访问范围属性
不同派生方式下基类成员在派生类中的可访问范围属性 派生方式 派生方式 派生方式 基类成员 公有派生 私有派生 保护派生 私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护 公有成员 公 ...
- C++改变基类成员在派生类中的访问属性
使用using声明可以改变基类成员在派生类中的访问属性.我们知道基类的公有成员经过公有继承,在派生类中其属性为public的,但是通过using 声明,我们可以将其改为private或protecte ...
- C++中public/private/protected三种继承方式下基类成员对派生类的可见性探讨
原文: http://blog.csdn.net/zgjxwl/article/details/4804233 1.public继承方式下 #include <iostream> ...
- 37、C++ Primer 4th笔记,特殊工具与技术,类成员指针
1.成员指针(pointer to member)包含类的类型以及成员的类型.成员指针只应用于类的非static成员.static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员 ...
- C++ Primer 5th笔记(chap 19 特殊工具与技术)类成员指针
1. 成员指针( pointer to member) 指可以指向类的非静态成员的指针. 成员指针指示的是类的成员, 而非类的对象. 类的静态成员不属于任何对象, 因此无须特殊的指向静态成员的指针 指 ...
- java 嵌套类 作用_java 嵌套类的分类、为什么使用嵌套类?
java程序语言允许你在一个类里面再声明另一个类,这样的类成为嵌套类,说明如下:class OuterClass { ... class NestedClass { ... } } 术语:嵌套类分为两 ...
最新文章
- Dotfuscator代码混淆工具的使用
- 计算机视觉的数据增广技术大盘点!附涨点神器,已开源!
- jQuery用于请求服务器的函数
- 殊途同归!招聘软件与社交软件最终都要走向约P宿命?
- STL常用容器大致对比
- 2018.12.30|区块链技术头条
- informix报错244_关于informix的配置问题
- LeetCode 965单值二叉树-简单
- 牛客16654 谁拿了最多奖学金
- CocoaPods pod install
- 正态分布、t分布、卡方分布、F分布的关系与差异
- EINT、DINT、ERTM、DRTM和INTM、DBGM解析
- 分享一篇投稿英文期刊该如何回复审稿人的文章
- NOTION 换深色背景 黑色背景
- 3.11 污点和容忍度
- docker mysql 高可用_docker搭建数据库高可用方案PXC
- python import变灰_pycharm中import呈现灰色原因的解决方法
- 音乐发烧友私藏!这里有一份端午浓情大礼包!
- C4D无法修改参数?所有参数都是灰色无法修改?
- arcgis导入坐标点转面_ArcGIS学习记录—Arcgis中点、线、面的相互转换方法