精华内容
下载资源
问答
  • 外定义成员函数 成员函数可以在体中直接定义。也可以在体中只写成员函数的声明,而在的外面进行函数定义。如: class Student { public : void display( ); //公用成员函数原型声明 private : int num...

    在类外定义成员函数

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

    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 成员函数

    类的成员函数也可以指定为内置函数。 

    在类体中定义的成员函数的规模一般都很小,而系统调用函数的过程所花费的时间开销相对是比较大的。调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间。为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制结构,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;
    };

    其中第3

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

    展开全文
  • 什么是成员函数和非成员函数

    千次阅读 2015-03-23 13:10:38
    类有成员变量和成员函数。而函数中,不是任何一个的成员的函数,就是非成员函数。例如: class A{ public:  void f1(){}; // 这个就是成员函数。  void f2(); // 这个也是成员函数声明,其实现在的...

    类有成员变量和成员函数。而函数中,不是任何一个类的成员的函数,就是非成员函数。例如:


    class A{
    public:
        void f1(){}; // 这个就是成员函数。
        void f2(); // 这个也是成员函数声明,其实现在类的外部。

    };


    void A::f2(){} // 这个是成员函数的实现。


    void f3(){}; // 这个就是非成员函数,它不属于A,也不属于任何一起其他的类。

    展开全文
  • C++ 类成员函数的函数指针

    万次阅读 多人点赞 2018-08-23 18:40:17
    一、引言 当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用... 正确的使用类成员函数指针(在下面介绍)   关于函数指针的定义和使用你还不清楚的话,可以先看这篇博客了解一下...

    一、引言

    当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用非静态的函数指针:

    reference to non-static member function must be called

    两个解决方法:

    1. 把非静态的成员方法改成静态的成员方法
    2. 正确的使用类成员函数指针(在下面介绍)

     

    关于函数指针的定义和使用你还不清楚的话,可以先看这篇博客了解一下:

    https://blog.csdn.net/afei__/article/details/80549202

     

    二、语法

    1. 非静态的成员方法函数指针语法(同C语言差不多):

    void (*ptrStaticFun)() = &ClassName::staticFun;

    2. 成员方法函数指针语法:

    void (ClassName::*ptrNonStaticFun)() = &ClassName::nonStaticFun;

    注意调用类中非静态成员函数的时候,使用的是 类名::函数名,而不是 实例名::函数名

     

    三、实例:

    #include <stdio.h>
    #include <iostream>
      
    using namespace std;
      
    class MyClass {
    public:
        static int FunA(int a, int b) {
            cout << "call FunA" << endl;
            return a + b;
        }
      
        void FunB() {
            cout << "call FunB" << endl;
        }
      
        void FunC() {
            cout << "call FunC" << endl;
        }
      
        int pFun1(int (*p)(int, int), int a, int b) {
            return (*p)(a, b);
        }
      
        void pFun2(void (MyClass::*nonstatic)()) {
            (this->*nonstatic)();
        }
    };
      
    int main() {
        MyClass* obj = new MyClass;
        // 静态函数指针的使用
        int (*pFunA)(int, int) = &MyClass::FunA;
        cout << pFunA(1, 2) << endl;
         
        // 成员函数指针的使用
        void (MyClass::*pFunB)() = &MyClass::FunB;
        (obj->*pFunB)();
         
        // 通过 pFun1 只能调用静态方法
        obj->pFun1(&MyClass::FunA, 1, 2);
         
        // 通过 pFun2 就是调用成员方法
        obj->pFun2(&MyClass::FunB);
        obj->pFun2(&MyClass::FunC);
     
        delete obj;
        return 0;
    }

    展开全文
  • C++的const类成员函数

    万次阅读 多人点赞 2013-03-04 18:00:42
    我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。...若要修改对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数

            我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。例如,

    const char blank = ‘’;
    blank = ‘\n’;  // 错误

            面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数)。例如,

    const Screen blankScreen;
    blankScreen.display();   // 对象的读操作
    blankScreen.set(‘*’);    // 错误:const类对象不允许修改

            在C++中,只有被声明为const的成员函数才能被一个const类对象调用。

            要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const,例如,

    class Screen {
    public:
       char get() const;
    };

            在类体之外定义const成员函数时,还必须加上const关键字,例如

    char Screen::get() const {
       return _screen[_cursor];
    }

            若将成员成员函数声明为const,则该函数不允许修改类的数据成员。例如,

    class Screen {
    public:
        int ok() const {return _cursor; }
        int error(intival) const { _cursor = ival; }
    };

            在上面成员函数的定义中,ok()的定义是合法的,error()的定义则非法。

            值得注意的是,把一个成员函数声明为const可以保证这个成员函数不修改数据成员,但是,如果据成员是指针,则const成员函数并不能保证不修改指针指向的对象,编译器不会把这种修改检测为错误。例如,

    class Name {
    public:
        void setName(const string &s) const;
    private:
        char *m_sName;
    };
    
    void setName(const string &s) const {
        m_sName = s.c_str();      // 错误!不能修改m_sName;
    
        for (int i = 0; i < s.size(); ++i) 
            m_sName[i] = s[i];    // 不好的风格,但不是错误的
    }

            虽然 m_Name 不能被修改,但 m_sName 是 char * 类型,const 成员函数可以修改其所指向的字符。

            const成员函数可以被具有相同参数列表的非const成员函数重载,例如,

    class Screen {
    public:
        char get(int x,int y);
        char get(int x,int y) const;
    };

            在这种情况下,类对象的常量性决定调用哪个函数。

    const Screen cs;
    Screen cc2;
    char ch = cs.get(0, 0);  // 调用const成员函数
    ch = cs2.get(0, 0);     // 调用非const成员函数

    小结:

    1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;

    2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;

    3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。

     

    参考资料:

    《C++ Primer第三版》

    《Effective C++第三版》

    展开全文
  • 一般来说,非成员函数应是友元函数,这样它才能直接访问的私有数据。 例如,Time的加法运算符在Time声明中的原型如下: Timeoperator+(constTime &amp; t) const; //成员函数版本 这个也可以使用...
  • c++的默认成员函数

    千次阅读 2019-05-14 21:23:08
    这些默认的类成员函数, 在类创建的时候, 编译器会自动调用, 但是自动调用并不意味着他们能完成用户所期待的所有任务, 像构造函数, 析构函数, 拷贝构造函数, 赋值重载会在某些情况下需要用户根据程序的需要自定义实现...
  • 成员函数(简称函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也返回值和函数类型,它与一般函数的区别只是:它是属于一个的成员,出现在体中。它可以被指定为private(私有的...
  • 成员函数:无论静态函数还是非静态函数,都是属于的(这一点与数据成员的静态非静态不同),对象并不拥有函数的拷贝.两者的区别在于:非静态的函数由对象(加.或指针加->;)调用,这时将向函数传递this指针.而静态函数由...
  • 例如私有的成员函数只能被本中的其它成员函数所调用,而不能被外调用。成员函数可以访问本中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。 一般的做法是将需要被外界调用的成员函数指定为...
  • 的默认成员函数

    千次阅读 2018-07-31 01:37:26
    默认生成的成员函数有六个,它们分别是:构造函数、拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载。 一、构造函数 1、什么是构造函数? 初始化对象,且仅在定义一...
  • const修饰成员函数

    千次阅读 2017-07-30 21:02:51
    尽量使用const,const修饰变量一般两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当const修饰成员函数时,成员函数有什么特点。...
  • C++——类数据成员和类成员函数

    千次阅读 2014-01-05 20:22:24
    C++——类数据成员和类成员函数 C++除了属于对象的成员——对象成员(或实例成员),还有属于类本身的一种成员,称之为类成员。 使用关键字static就可以创建一个类成员。   一、 类数据成员 static数据成员在类...
  • 默认生成的成员函数

    千次阅读 2016-07-19 17:18:12
    默认生成的六个成员函数 一、构造函数  我们知道,的数据成员是不能在声明的时候初始化的,因为不是一个实体,而是一种抽象的数据类型,并不占据存储空间。为了解决这个问题,C++提供了构造函数来...
  • C++获取成员函数的函数指针

    万次阅读 2017-08-01 11:02:43
    注意调用中非静态成员函数的时候,使用的是类名::函数名;而不是实例名::函数名。
  • 类成员函数作为线程函数使用

    万次阅读 多人点赞 2017-01-11 11:37:50
    类成员函数作为线程函数使用 C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该类的对象。函数体可以通过显示调用该指针或直接访问类内成员。 回调函数是用指针来调用的函数,最常使用的回调...
  • c++的几种成员函数声明后必须要定义吗? 1. 构造函数和析构函数 test.h #pragma once class CTest { public: CTest(); ~CTest(); }; test.cpp #include "stdafx.h" #include "test.h" 情况一: main.cpp #...
  • 当成员变量是私有的时候,要对它们初始化就必须用一个公有的成员函数来进行。同时这个成员函数应在仅且在对象定义时自动的执行一次,这个函数我们就叫做构造函数。2. 构造函数的特点(1)函数名与类名相同;(2)无...
  • C++的虚成员函数

    千次阅读 2017-04-19 21:12:12
    虚函数就是成员函数前面加上virtual关键字的函数。虚函数的作用就是为了实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。...
  • 解释如下: C++中每一个对象所占用的空间大小,是在编译的...这也就是模板为什么只是称之为模板,而不是泛型的缘故。 既然是在编译的时候,根据套用的不同类型进行编译,那么,套用不同类型的模板实际上就是两
  • 【C++深度剖析教程5】C++中的静态成员函数

    万次阅读 多人点赞 2017-12-15 01:35:29
    先给大家推荐一个C++面试题集锦吧,保证能让你在众多面试者脱颖而出,点击...C++中的静态成员变量)。 我们回顾一下客户的需求: -统计在程序运行期间某个的对象的数目 -保证程序的安全性(不能使用全局变量)
  • 有些情况下,允许特定的非成员函数访问一个的私有成员,同时仍阻止一般的访问,这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问的私有数据成员。 友元(frend)机制允许一个将对其非...
  • 不小心犯了一个错误, 导致项目代码编译不过,项目使用的语言是c++,一直报’bind(,xxxx)这类似的错误,开始以为是基础基类的方法问题,但查看代码之后发现,我们要bind的成员函数不是虚函数,也没有继承基类的...
  • C++中类成员函数作为回调函数

    万次阅读 多人点赞 2013-11-28 10:45:58
    回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。  普通的C++成员函数都隐含了...
  • C++static类成员,static类成员函数

    万次阅读 多人点赞 2017-03-20 14:33:14
    1.static类成员 在C++primer里面说过,static类成员不...就是static不会想普通类数据成员一样每一个类对象都一份,全部类对象是共享一个static类成员的,例如A类对象修改了static成员为1,那么B对象对应的static类对
  • 运算符重载函数既可以做为类成员函数也可以重载为友元函数,但使用定义方法和使用上是由较大差别的。 运算符重载函数作为类成员函数 首先看一个运算符重载函数作为类成员函数的示例代码: 定义Complex为复数类,...
  • (因为静态成员变量在对象创建之前就已经被分配了内存空间)静态成员变量虽然在中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放)。...
  • 成员函数是指在类内部定义的函数,非成员函数是指在某个命名空间或者全局空间内的函数,友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。成员函数与非成员函数的最大区别是,成员函数可以是虚拟的。 ...
  • C++中一个类成员函数调用另一个类成员的方法

    万次阅读 多人点赞 2018-10-31 23:13:01
    在C++中一个类成员函数调用另一个类成员的方法主要:类的组合,友元类,单例模式等,下面主要讲讲这三种方法的实现 方法1:利用类的组合 组合通俗来讲就是类B类A的属性,如声明一个Person类,再声明一个...
  • 友元函数 友元 友元成员函数

    千次阅读 2018-05-07 22:34:40
    友元 一般来说,内的私有数据是对外不可见的,但在有些情况下,我们需要在外对该的私有数据进行访问,这就需要用到一种新技术——友元(friend),即在声明前...友元函数是指某些非类成员函数,但可以访问...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 482,094
精华内容 192,837
关键字:

哪个不是类必须有成员函数