参考:http://www.weixueyuan.net/view/6334.html

总结:

  类成员的声明和定义:

  类成员函数的定义分类内定义(内联)和类外定义(可用 inline 关键字 强制转换为内联函数)。

类是一种数据类型,该类型类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的一个集合。下面是student类的定义。

[例1] 类可以包含成员变量和成员函数:

  1. class student
  2. {
  3. char name[20]; //姓名
  4. int id_num; //学号
  5. int age; //年龄
  6. char sex; //性别
  7. void set_age(int a);
  8. int get_age();
  9. };

本例声明了类student,并且在student类中声明了四个成员变量:name、id_num、age和sex。这四个成员变量用于描述student特性。除此之外我们还在类中定声明了两个函数,set_age函数和get_age函数,这两个函数是student类的成员函数,这两个函数只给出了声明,未给出定义。

两种方法可以给出成员函数的定义:

  • 在类内部进行函数的声明和定义,此种方式我们称为inline,也即内联定义。inline是C++关键字,专门用于表示内联;
  • 在类内进行函数声明,在类外部进行函数定义。

下面我们分别给出两种情况的示例。

[例2] 在类内部进行函数的声明和定义:

  1. class student
  2. {
  3. char name[20]; //姓名
  4. int id_num; //学号
  5. int age; //年龄
  6. char sex; //性别
  7. void set_age(int a){age = a;}
  8. int get_age(){return age;}
  9. };

在本例中,两个成员函数均是在类声明内部进行声明和定义的,因此这两个函数是inline类型的。

内联函数可以通知编译器在编译阶段用成员函数set_age和get_age的函数体替换掉所有调用该函数的代码,这样替换后的代码将不会再出现对这个函数的调用的代码。通过直接的替换可以在一定程度上提高程序运行效率,通常只是用于一些简短函数。

[例3] 在类内部声明函数,在类外部定义函数:

  1. class student
  2. {
  3. char name[20]; //姓名
  4. int id_num; //学号
  5. int age; //年龄
  6. char sex; //性别
  7. void set_age(int a);
  8. int get_age()const;
  9. };
  10. //在类外部定义set_age函数
  11. void student::set_age(int a)
  12. {
  13. age = a;
  14. }
  15. //在类外部定义get_age函数
  16. int student::get_age()const
  17. {
  18. return age;
  19. }

本例中set_age函数和get_age函数在类声明内部仅有声明部分,而无定义部分,其函数体在类声明之外定义。本例中定义函数采用了域解析符 ::。

在类内声明函数,如果在函数声明时使用inline关键字,如例4所示,则可以将类内声明类外定义的函数强制转换为内联函数。

[例4] 强制转换为内联函数:

  1. class student
  2. {
  3. char name[20]; //姓名
  4. int id_num; //学号
  5. int age; //年龄
  6. char sex; //性别
  7. inline void set_age(int a);
  8. inline int get_age();
  9. };
  10. //在类外部定义set_age函数
  11. void student::set_age(int a)
  12. {
  13. age = a;
  14. }
  15. //在类外部定义get_age函数
  16. int student::get_age()
  17. {
  18. return age;
  19. }

在例4中,student类中声明函数set_age和get_age时都使用了inline关键字,这就使得这两个函数也成为了内联函数,尽管它们是在类外进行定义函数体的。

2.2 C++类的成员变量和成员函数的更多相关文章

  1. c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用

    c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用 c++不会像上图那样为每一个对象的成员变量和成员函数开辟内存空间, 而是像下图那样,只为每一个对象的成员变量开辟空间.成员 ...

  2. java面向对象---成员变量和成员函数

    //成员变量 1.类定义了对象中所具有的变量,这些变量称作成员变量 2.每个对象都有自己的变量,和同一个类的其他对象的分开的 //函数与成员变量 1.在函数中可以直接写成员变量的名字来访问成员变量,那 ...

  3. C++ 类的静态成员变量及静态成员函数

    ps:下面所说 成员=成员变量+成员函数: 作用 由于对象与对象之间的成员变量是相互独立的.所以要想共用数据,则需要使用静态成员和静态函数. 空间分配 静态成员是在程序编译时分配空间,而在程序结束时释 ...

  4. Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)

    1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...

  5. 成员变量和成员函数前加static的作用?

    成员变量和成员函数前加static的作用?答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数.分别用来反映类的状态.比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作 ...

  6. 【转】C++ const成员变量和成员函数(常成员函数)

    转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...

  7. C++ const成员变量和成员函数(常成员函数)

    在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只 ...

  8. [原]Unity3D深入浅出 - 常用类的成员变量和成员函数(Tranform、Time、Random、Mathf、Input)

    Transform的成员变量 Transform的成员函数 Time类,获取和时间相关的信息,可用来计算帧速率,调整时间流逝的速度等. Random类,可用来生成随机数,随机点和旋转. Mathf类提 ...

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

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

随机推荐

  1. NetMagic Simple Overview

    参考: NetMagic Startup: How to develop NetMagic rapidly NetMagic Simple Overview NetMagic 是什么? NetMagi ...

  2. UVa 10723 电子人的基因(LCS)

    https://vjudge.net/problem/UVA-10723 题意: 输入两个A~Z组成的字符串,找一个最短的串,使得输入的两个串均是它的子序列,另外还需要统计长度最短的串的个数. 思路: ...

  3. MVC ---- Manager.ttinclude内容

    http://www.infoq.com/cn/news/2009/11/T4-Multiple-Output 初次认识并尝试使用T4生成代码的时候,相关学习资料似乎比较少.不过现在VS2010 的M ...

  4. go变量赋初值

    package main import "fmt" func variableinitial(){ , var s string="abc" fmt.Print ...

  5. Jmeter自动化测试 POST请求和GET请求用if控制器,可以二次开发源码,将请求方式通过数据源传入,就不需要做多余的判断

    Jmeter自动化测试 POST请求和GET请求用if控制器,可以二次开发源码,将请求方式通过数据源传入,就不需要做多余的判断 目前常用的做法:

  6. jquery zTree异步加载的例子

    下面是使用zTree异步加载的一个例子: 1)初始化树的时候是ajax请求,返回nodes列表来初始化树的:如果一开始就异步的话,$.fn.zTree.init($("#zTree" ...

  7. 【转】libxml2 如何获得某个节点的所有信息

    网址:http://bbs.csdn.net/topics/380115580 顶楼: 我的需求是这样的,我使用libxml2从内存中解析一个xml文件,需要修改某个节点下的一个子节点,修改完成之后, ...

  8. 很火的Java题——判断一个整数是否是奇数

    完成以下代码,判断一个整数是否是奇数: public boolean isOdd(int i) 看过<编程珠玑>的人都知道这道题的答案和其中极为简单的道理. 最普遍的风格,如下: 这个函数 ...

  9. vs.net应用程序图标以及制作安装程序快捷方式图标设置

           我们通常在开发软件完毕后需要打包制作安装程序,这个时侯一般都会需要设置应用程序的图标,使用默认的图标一般都比较难看,那么我们应该怎样设置自定义的图标呢? 我现在要讲的图标设置有两种情况, ...

  10. 用Rails.5.2+ Vue.js做 vue-todolist app

    Rails5.2+Vue.js完成Lists(curd) 注意: Edit/update使用SPA(single-page Application单页面程序)的方法完成.点击文字出现一个输入框和按钮. ...