精华内容
下载资源
问答
  • 成员函数(简称函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个的成员,出现在类体中。它可以被指定为private(私有的...

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为private(私有的)、public (公用的)或protected(受保护的)。

    在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。

    一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。但应注意,并非要求把所有成员函数都指定为public。有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为private。这种函数的作用是支持其它函数的操作,是类中其它成员的工具函数(utility function),类外用户不能调用这些私有的工具函数。

    类的成员函数是类体中十分重要的部分。如果一个类中不包含成员函数,就等同于C语言中的结构体了,体现不出类在面向对象程序设计中的作用。

    在类外定义成员函数

    在前面已经看到成员函数是在类体中定义的。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如:

    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)或称作用域运算符,用它声明函数是属于哪个类的。

    如果在作用域运算符“::”的前面没有类名,或者函数名前面既无类名又无作用域运算符“::”,如
    ::display( ) 或 display( )
    则表示display函数不属于任何类,这个函数不是成员函数,而是全局函数,即非成员函数的一般普通函数。

    类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。

    虽然函数在类的外部定义,但在调用成员函数时会根据在类中声明的函数原型找到函数的定义(函数代码),从而执行该函数。

    在类的内部对成员函数作声明,而在类体外定义成员函数,这是程序设计的一种良好习惯。如果一个函数,其函数体只有2-3行,一般可在声明类时在类体中定义。多于3行的函数,一般在类体内声明,在类外定义。

    展开全文
  • 成员函数(简称函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个的成员,出现在类体中。它可以被指定为private(私有的...

    作者原文:https://www.cnblogs.com/wuchanming/p/4061654.html

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为private(私有的)、public (公用的)或protected(受保护的)。

    在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。

    一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。但应注意,并非要求把所有成员函数都指定为public。有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为private。这种函数的作用是支持其它函数的操作,是类中其它成员的工具函数(utility function),类外用户不能调用这些私有的工具函数。

    类的成员函数是类体中十分重要的部分。如果一个类中不包含成员函数,就等同于C语言中的结构体了,体现不出类在面向对象程序设计中的作用。

    在类外定义成员函数

    在前面已经看到成员函数是在类体中定义的。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    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)或称作用域运算符,用它声明函数是属于哪个类的。

    如果在作用域运算符“::”的前面没有类名,或者函数名前面既无类名又无作用域运算符“::”,如
        ::display( ) 或 display( )
    则表示display函数不属于任何类,这个函数不是成员函数,而是全局函数,即非成员函数的一般普通函数。

    类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。

    虽然函数在类的外部定义,但在调用成员函数时会根据在类中声明的函数原型找到函数的定义(函数代码),从而执行该函数。

    在类的内部对成员函数作声明,而在类体外定义成员函数,这是程序设计的一种良好习惯。如果一个函数,其函数体只有2-3行,一般可在声明类时在类体中定义。多于3行的函数,一般在类体内声明,在类外定义。

    inline 成员函数

    关于内置(inline )函数,在前边已经作过介绍,请猛击:C++内置函数。类的成员函数也可以指定为内置函数。

    在类体中定义的成员函数的规模一般都很小,而系统调用函数的过程所花费的时间开销相对是比较大的。调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间。为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制结构,C++系统会自动将它们作为内置(inline)函数来处理。

    也就是说,在程序调用这些成员函数时,并不是真正地执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌入程序的调用点。这样可以大大减少调用成员函数的时间开销。C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    class Student

    {

    public :

    void display( )

    {

    cout<<"num:"<<num<<endl;cout<<"name:"

    <<name<<endl;cout<<"sex:"<<sex<<endl;

    }

    private :

    int num;

    string name;

    char sex;

    };

    其中第3行
        void display( )
    也可以写成
        inline void display( )
    将display函数显式地声明为内置函数。

    以上两种写法是等效的。对在类体内定义的函数,一般都省写inline。

    应该注意的是,如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置(inline )函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline作显式声明。如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

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

    展开全文
  • C++中在类外部定义成员函数

    千次阅读 2020-10-14 10:22:21
    1 外部定义成员函数 代码如下所示 classMyClass{ voidmyFunc(); inti; }; voidMyClass::myFunc() { i = 1; } 此时MyClass的成员函数myFunc()MyClass之外定义。虽然myFunc()函数看上去没有在类的作用...

    类的成员函数可以在类内部定义,也可以在类的外部定义。当定义在类的外部时,需要同时提供类名和函数名。

    1 类外部定义成员函数

    代码如下所示

    class MyClass{
      void myFunc();
      int i;
    };
    void MyClass::myFunc() {
      i = 1;
    }

    此时类MyClass的成员函数myFunc()在MyClass类之外定义。虽然myFunc()函数看上去没有在类的作用域之内,但是由于提供了MyClass类,实际上这时myFunc()就已经在类的作用域之内了。因此,在myFunc()内部可以直接使用MyClass类的成员变量i,而无需使用作用域访问符来修饰i。

    2 返回值是类内定义类型的函数

    函数的返回值位于函数名之前,即MyClass类名字之前,因此函数的返回值并没有在类的作用域之内。如果返回值是MyClass类内定义的类型,则需要通过作用域访问符来修饰该返回值。

    class MyClass{
      class retClass {
      };
      retClass myFunc();
      retClass rc;
    };
    MyClass::retClass MyClass::myFunc() {
      return rc;
    }

    在以上代码中,retClass类是MyClass类内部定义的类,MyClass类的成员函数myFunc()函数在类外部定义,其返回值是retClass。由于retClass是在MyClass类内部定义的类,所以在类外定义的myFunc()函数的返回值应该是MyClass::retClass,而不能直接使用retClass。

    展开全文
  • 在类定义成员函数 成员函数可以在类体中直接定义。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如: class Student { public : void display( ); //公用成员函数原型声明 private : int ...

    在类外定义成员函数

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

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

    展开全文
  • C++之在类定义成员函数

    千次阅读 2018-05-11 10:27:13
    #include &lt;iostream&gt;using namespace std;class Student{public: void get(); void display();private: int age; string name;};void Student::get(){ cin&...}void Student::display(){ ...
  • 定义成员函数

    千次阅读 2017-10-18 17:26:11
    //1、定义成员函数 class Student { public: void display();//公用成员函数声明 private: int num; char name[20]; char sex; }; void Student::display()//外定义display函数,“::”是作用域...
  • C++之定义成员函数

    千次阅读 2018-05-11 09:58:52
    #include &lt;iostream&gt;using namespace std;class Student{public: void get() { cin&gt;&gt;age&gt;&gt;name; } void display() { cout&lt;&lt;"..."
  • 今天学习一下成员...如果写在类的里面就叫做成员函数 int sum(int x, int y)//写在类的外部 { return x + y; } class Sales_item { public: std::string isbn;//书号 unsigned units_sold;//数量 do...
  • c++的几种成员函数声明后必须要定义吗? 1. 构造函数和析构函数 test.h #pragma once class CTest { public: CTest(); ~CTest(); }; test.cpp #include "stdafx.h" #include "test.h" 情况一: main.cpp #...
  • 成员函数可以访问本中任何成员(包括私有的和公用的),可以引用本作用域中有效的数据。 一般的做法是将需要被外界调用的成员函数指定为public,它们是的对外接口。但应注意,并非要求把所有成员函数都指定为...
  • #include using namespace std;class Time{private:int hour;int minute;int sec;public:void sl();void sc();};void Time::sl(){cin>>hour;cin>>minute;cin>>sec;...void Time::sc(){cout<<hour<<":"<<minute<<":"<<
  • 我们知道,的常成员函数尾部加了const关键字,而且,声明定义处必须都加const关键字。 举个例子说明: //a.h class A { public: A(){} ~A(){} void display() const; }; //a.cpp #include "a.h" ...
  • 今天写STL中 rb_tree 的时候意外的发现一个问题:模板类的模板成员函数不能在类定义外部进行特化,特化必须放在类定义内,否则将报错:error C2244: “X::test”: 无法将函数定义与现有的声明匹配 经过写如下的...
  • C++:如何声明定义成员函数

    千次阅读 2015-10-28 11:29:51
    不过成员函数是属于某一个的,所以只能在类的内部声明,即在定义类的时候写明成员函数的函数原型,同时要注意此函数是公有的还是私有的。如果一个的某个成员函数是私有的,那么它只能被这个的其他成员函数调用...
  • 关于C++头文件中定义成员函数

    千次阅读 2018-03-09 15:28:29
    对于Java来说,class文件中包含了成员函数定义,但是,对于C++来说,一般将成员函数声明放在头文件,而将其实现放在.cpp里面,那么头文件中写成员函数的具体实现是否可以呢?The C++ ISO standard says:"...
  • 如何定义成员函数?.

    千次阅读 2017-01-19 10:28:23
    两种方法: class()中定义成员函数。 类似定义普通函数。返回值类型 /函数名/ ...class外定义成员函数时,要class()内对成员函数进行声明。返回值类型/函数名/形参类型【注】与函数声明一样,形
  • 2、每个成员函数在模板外定义的时候前面都要有模板的声明,注意是每个。 #include&lt;iostream&gt; using namespace std; template&lt;class numtype&gt; //模板声明 class compare { public:...
  • 说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class 可以包含基本数据类型可以包含类型。 请看以下程序: [cpp] view ...
  • =================================开始=======================================  当一个被多个程序使用时,一般将声明...而成员函数定义另一个源文件中描述,以实现声明成员函数定义相分离。
  • C++:成员函数定义方式

    千次阅读 2017-09-07 10:08:00
    1、成员函数的第一种定义方式:在类声明中只给出成员函数的原型,而将成员函数定义放在的外部。返回值类型 类名::成员函数名(参数表){ 函数体} class Point{ public: void setpoint(int,int); //设置坐标...
  • 类声明成员函数定义的分离

    千次阅读 2015-10-12 21:06:59
    为了实现的隐蔽性,对类成员函数定义一般不放在头文件中,而放在另一个文件中,即类声明和函数定义是分别放在两个文件中的。 实际上一个C++程序是由3个部分组成的:类声明头文件(后缀为.h);实现文件(后缀...
  • 4.如何定义以及访问的方式与普通成员变量和普通成员函数的区别? 5.是怎么分配内存的? 当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不属于某一对象(所有...
  • --------------------------------------------------------——————————————————————————————————...先来做一个实验,你一个头文件中定义一个,然后把内中的一个函数的实现
  • 今天尝试自己实现vector数据结构底层,在定义vector模板的时候,还想像往常一样把分为.h文件和.cpp文件,把成员函数声明放在.h文件中,把具体实现放在.cpp文件中,结果测试时发现编译过程中报错。...
  • 静态成员函数定义

    千次阅读 2017-11-16 11:37:15
    静态成员函数定义
  • 定义成员函数是内联函数

    千次阅读 2017-06-13 08:43:58
    之前看书的时候没有注意到这点,今天再翻primer发现了这句话,感觉好神奇,...在类定义成员函数默认为inline,不论前面是否加了inline,当然,是否内联还是取决于编译器啦~而在类定义成员函数就不是内联函数。
  • 今天编写数组链表的程序,出现了一个问题,我ArrayList.h中定义了一个模板ArrayList,然后按照原来的习惯,另一个源文件ArrayList.cpp中对模板成员函数进行定义,编译也通过了,但是当我main函数对模板...
  • 今天清理手机微信没用的数据【惊人啊,删了1G+的图...回忆了一下,当时讨论的是:为啥成员函数在类定义时,函数名不能加static?       class Point { public: void init() { } static void o...
  • “通常情况下,你会.h文件中声明函数,而将它们的定义放置一个单独的.cpp文件中。但是使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 353,384
精华内容 141,353
关键字:

在声明类的同时定义成员函数