C++类的成员函数(在类外定义成员函数、inline成员函数)

news/2024/6/19 6:09:55

在类外定义成员函数

成员函数可以在类体中直接定义。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如:

class Student
{
public :
    void display( ); //公用成员函数原型声明  
private :
    int num;
    string name;
    char sex;
    //以上3行是私有数据成员
};
void Student::display( )//在类外定义display类函数  
{
    cout<<"num:"<<num<<endl;
    cout<<"name:"<<name<<endl;
    cout<<"sex:"<<sex<<endl;
}
Student stud1,stud2; //定义两个类对象

注意:在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。但成员函数在类外定义时,必须在函数名前面加上类名,予以限定(qualifed),” :: “是作用域限定符(field qualifier)或称作用域运算符,用它声明函数是属于哪个类的。:: 可以不跟类名,表示全局数据或全局函数(即非成员函数)。

int month;//全局变量
int day;
int year;
void Set(int m,int d,int y)
{
    ::year=y; //给全局变量赋值,此处可省略
    ::day=d;
    ::month=m;
}

Class Tdate
{
    public:
        void Set(int m,int d,int y) //成员函数
        {
            ::Set(m,d,y); //非成员函数
        }
    private:
        int month;
        int day;
        int year;
}

类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。虽然函数在类的外部定义,但在调用成员函数时会根据在类中声明的函数原型找到函数的定义(函数代码),从而执行该函数。在类的内部对成员函数作声明,而在类体外定义成员函数,这是程序设计的一种良好习惯。如果一个函数,其函数体只有2-3行,一般可在声明类时在类体中定义。多于3行的函数,一般在类体内声明,在类外定义。

inline 成员函数

在类体中定义的成员函数的规模一般都很小,而系统调用函数的过程所花费的时间开销相对是比较大的。调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间。为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制结构,C++系统会自动将它们作为内置(inline)函数来处理。也就是说,在程序调用这些成员函数时,并不是真正地执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌入程序的调用点。这样可以大大减少调用成员函数的时间开销。C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。如:

class Student
{
public :
    void display()
    {
        cout<<"num:"<<num<<endl;cout<<"name:"
        <<name<<endl;cout<<"sex:"<<sex<<endl;
    }
private :
    int num;
    string name;
    char sex;
};

其中第4行 void display( )也可以写成 inline void display(),将display函数显式地声明为内置函数。以上两种写法是等效的。对在类体内定义的函数,一般都省写inline。应该注意的是,如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置(inline)函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline作显式声明。如:

class Student
{
    public : inline void display( );//声明此成员函数为内置函数
    private :
    int num;
    string name;
    char sex;
};

inline void Student::display( ) // 在类外定义display函数为内置函数
{
    cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;
}

值得注意的是,如果在类体外定义inline函数,则必须将类定义和成员函数的定义都放在同一个头文件中(或者写在同一个源文件中),否则编译时无法进行置换(将函数代码的拷贝嵌入到函数调用点)。但是这样做,不利于类的接口与类的实现分离,不利于信息隐蔽。虽然程序的执行效率提高了,但从软件工程质量的角度来看,这样做并不是好的办法。只有在类外定义的成员函数规模很小而调用频率较高时,才将此成员函数指定为内置函数。


http://www.niftyadmin.cn/n/1337604.html

相关文章

abstract类可以创建对象_java 三个修饰符 abstract、static、final

abstract 修饰符。被 abstract 修饰的类&#xff0c;称为抽象类。抽象类无法实例化&#xff0c;可以作为数据类型接收子类的实例&#xff0c;应用于多态。抽象类可以有构造方法。public abstract class Animal { public Animal() { System.out.println("animal 构造.&…

C++函数指针(包括指向成员函数的指针)

函数指针的初始化 函数如下&#xff1a; int CompareString(const string& str1, const string& str2) {return str1.compare(str2); } 函数的初始化有两种方式&#xff1a; 第一种&#xff0c;也是最普遍的方式&#xff1a; int (*CompareFunction)(const string…

C++继承构造原则

构造方法用来初始化类的对象&#xff0c;与父类的其它成员不同&#xff0c;它不能被子类继承&#xff08;子类可以继承父类所有的成员变量和成员方法&#xff0c;但不继承父类的构造方法&#xff09;。因此&#xff0c;在创建子类对象时&#xff0c;为了初始化从父类继承来的数…

mx250显卡天梯图_2020年最新笔记本显卡天梯图,看看你的显卡排在哪!

显卡天梯图就是显卡的性能排行榜&#xff0c;目前显卡主要有Nvidia(英伟达)和AMD(超微半导体)两大品牌。我们都知道&#xff0c;显卡性能决定了电脑的图像处理能力。对于喜欢玩游戏的电脑用户来说&#xff0c;处理器和显卡是用户最关心的电脑硬件&#xff0c;一块好的显卡对于游…

C++虚继承中的菱形继承的简单解决

在C继承中考虑这样一个关系&#xff1a; B与C都是从相同的基类派生的&#xff0c;该基类称为A,然后D多重继承了B和C&#xff0c;因为B和C都包含了A的子对象。所以C包含了A的两个子对象。继承关系如下图&#xff1a; 从继承图形状上看&#xff0c;有时该继承层次结构称为菱形。…

重载、重写、重定义

重载&#xff08;overload&#xff09;&#xff0c;重写&#xff08;override,也称覆盖&#xff09;&#xff0c; 重定义&#xff08;redefine,也称隐藏&#xff09;&#xff08;PS:第三个我不确定在英文中是否应该称为redefine&#xff0c;如有问题&#xff0c;留言告知&#…

date和datetime长度设置多少_那曲四合一可燃气体报警仪多少钱【意通顺电子】

那曲四合一可燃气体报警仪多少钱【意通顺电子】深圳意通顺电子有限公司创建于1998年&#xff0c;是集研发生产与销售为一体的高科技企业。意通顺电子防盗报警器是深圳市科技局评定的高新技术项目公司在此行业已经积累了10年的产销经验,为适应新的市场竞争,本着品质为先&#xf…

函数对象、谓词概念、内建函数对象

1.函数对象的概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象(function object),即它们是行为类似函数的对象&#xff0c;也叫仿函数(functor)&#xff0c;其实就是重载"()"操作符&#xff0c;使得类对象可以像函数那样调用 注意&#xff1a; 函数对象…