类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。

类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。

类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定;而普通函数是独立的,作用范围是全局的,或位于某个命名空间内。

上节我们在示例中给出了 Student 类的定义,如下所示:

  1. class Student{
  2. public:
  3. //成员变量
  4. char *name;
  5. int age;
  6. float score;
  7. //成员函数
  8. void say(){
  9. cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
  10. }
  11. };

这段代码在类体中定义了成员函数。你也可以只在类体中声明函数,而将函数定义放在类体外面,如下图所示:

  1. class Student{
  2. public:
  3. //成员变量
  4. char *name;
  5. int age;
  6. float score;
  7. //成员函数
  8. void say(); //函数声明
  9. };
  10. //函数定义
  11. void Student::say(){
  12. cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
  13. }

在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。

但当成员函数定义在类外时,就必须在函数名前面加上类名予以限定。::被称为域解析符(也称作用域运算符或作用域限定符),用来连接类名和函数名,指明当前函数属于哪个类。

成员函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前。

inline 成员函数

在类体中和类体外定义成员函数是有区别的:在类体中定义的成员函数会自动成为内联函数,在类体外定义的不会。当然,在类体内部定义的函数也可以加 inline 关键字,但这是多余的,因为类体内部定义的函数默认就是内联函数。

内联函数一般不是我们所期望的,它会将函数调用处用函数体替代,所以我建议在类体内部对成员函数作声明,而在类体外部进行定义,这是一种良好的编程习惯,实际开发中大家也是这样做的。

当然,如果你的函数比较短小,希望定义为内联函数,那也没有什么不妥的。

如果你既希望将函数定义在类体外部,又希望它是内联函数,那么可以在定义函数时加 inline 关键字。当然你也可以在函数声明处加 inline,不过这样做没有效果,编译器会忽略函数声明处的 inline,我们已在《如何规范地使用C++内联函数》中对这点进行了详细讲解。

下面是一个将内联函数定义在类外部的例子:

  1. class Student{
  2. public:
  3. char *name;
  4. int age;
  5. float score;
  6. void say(); //内联函数声明,可以增加 inline 关键字,但编译器会忽略
  7. };
  8. //函数定义
  9. inline void Student::say(){
  10. cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
  11. }

这样,say() 就会变成内联函数。

这种在类体外定义 inline 函数的方式,必须将类的定义和成员函数的定义都放在同一个头文件中(或者同一个源文件中),否则编译时无法进行嵌入(将函数代码的嵌入到函数调用出),具体原因我们已在《如何规范地使用C++内联函数》中进行了讲解。

再次强调,虽然 C++ 支持将内联函数定义在类的外部,但我强烈建议将函数定义在类的内部,这样它会自动成为内联函数,何必费力不讨好地将它定义在类的外部呢,这样并没有任何优势。

转载于:https://www.cnblogs.com/gzgb/p/6264262.html

C++类的成员变量和成员函数的介绍相关推荐

  1. 类和对象- C++对象模型和this指针- 成员变量和成员函数分开存储

    成员变量和成员函数分开存储 在C++中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用内存空间 class Person {};void test01() {Pers ...

  2. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

  3. 成员变量和成员函数分开存储

    首先来说结论: 1.在C++中,类内的成员变量和成员函数分开存储 2.只有非静态成员变量才属于类的对象上 空类(类中上面对象都没没有)占用内存大小为:1 #include <iostream&g ...

  4. C++成员变量和成员函数分开存储

    C++t成员变量和成员函数分开存储 类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 class Person ...

  5. c++学习之const成员变量与成员函数

    c++学习之const成员变量与成员函数 常类型是指用类型修饰符const说明的类型,常类型的变量或者对象的值是不能被更新的.因此,定义或说明常类型时必须初始化. 如果在一个类声明常数据成员,那么任何 ...

  6. C++ const成员变量和成员函数

    const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字.初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表. co ...

  7. C++学习笔记(十)成员变量和成员函数分开存储、this指针、空指针访问成员函数、const修饰成员函数、友元

    1.成员变量和成员函数分开存储 //1.在C++中,类内的成员变量和成员函数分开存储 //2.只有非静态成员变量才属于类的对象上 //空对象占用内存空间为:1 //C++编译器会给每个空对象也分配一个 ...

  8. Java 多态中成员变量与成员属性的特点【复习】

    package firstchapter;/*** 多态中成员变量与成员属性的特点*/ public class polymorphic {public static void main(String ...

  9. python中的类的成员变量以及property函数

    1 python类的各种变量 1.1 全局变量 在类外定义的变量. 1.2 类变量 定义在类里面,所有的函数外面的变量.这个变量只有一份,是所有的对象共有的.在类外用"类."来引用 ...

最新文章

  1. linux 软件包的安装
  2. greenPlum资源隔离
  3. PyTorch GPU安装指南 (Ubuntu 16.04 anaconda cuda8.0 cuDNN6.0)
  4. vscode debug c++与opencv程序
  5. 损失函数 之 交叉熵
  6. Layui表单验证及提交
  7. (七) 三维点云课程---ICP(Point-to-Point)
  8. 苹果笔记本没有计算机管理员,Mac管理员账户丢失怎么办
  9. vue获取内外网ip地址
  10. NX/UG二次开发—其他—NX中C++调用C#工具并传参
  11. 利用qq账号查询所绑定的手机号码_怎么不用手机号注册新微信账号 免手机号申请方法分享...
  12. 客户端单周发版下的多分支自动化管理与实践
  13. 谷粒商城微服务分布式基础篇二—— Spring Cloud Alibaba、Nacos注册与发现
  14. DCC_2012_Sihong Su . Xiaohu Tang rotation symmetric boolean functions
  15. maven 一次打包多个maven项目
  16. 取Json中的数组进行遍历
  17. java生成随机数的方法_Java获取随机数的3种方法
  18. STM32HAL库RS485-ModBus协议控制伺服电机
  19. 火萤组件实现 android,火萤组件手机下载-火萤组件安卓免费版下载 - Iefans
  20. 理论讲解:帮助你快速懂得心算十进制转二进制------------一做就会一讲就废系列

热门文章

  1. mysql查询每日/某时间段/当日新增用户人数
  2. java 将小数度数转换为度分秒格式
  3. python反射机制
  4. 深入理解 MVC 中的 M 与 C
  5. Java集合(四) LinkedList详解
  6. 代理设置。 安卓工作室配置用http代理。gradle可能需要这些http代理设置去访问互联网。例如下载依赖。 你想要复制ide的代理配置到这个项目的gradle属性文件吗?...
  7. 惠普在安全领域发力 收购大数据加密企业
  8. 烂泥:dnsmasq搭建简易DNS服务器
  9. 即将面世——AWS SDK for Go
  10. JSP断点续传多线程链接下载