精华内容
下载资源
问答
  • 2020-10-14 10:22:21

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

    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。

    更多相关内容
  • 成员函数(简称函数)是函数的一种,它的用法和作用和前面介绍...例如私有的成员函数只能被本中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本中任何成员(包括私有的和公用的),可以引用本作

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为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行的函数,一般在类体内声明,在类外定义。

    展开全文
  • 题目要求: 以上程序(第2章习题第2小题)基础上进行修改: 在类体内声明成员函数,在类外定义成员函数。 ——谭浩强的《C++面向对象程序设计》第2章习题第3小题

    题目要求

    /*
    ************************************************************************
    @file:    2_2.cpp
    @date:   2020.10.26
    @author: Xiaoxiao
    @brief:   数据成员设为私有;
    		  输入输出功能由成员函数实现;
    		  在类体内定义成员函数。
    @blog:    https://blog.csdn.net/weixin_43470383/article/details/109298731	  
    ************************************************************************
    */
    #include <iostream>
    using namespace std;
    
    class Time // 声明类类型
    {
    private: // 声明私有部分
    	int hour;
    	int minute;
    	int sec;
    
    public: // 声明公用部分
    	void set_time(void) // 类体内定义成员函数
    	{
    		cin >> hour;
    		cin >> minute;
    		cin >> sec;
    	}
    
    	void show_time(void) // 类体内定义成员函数
    	{
    		cout << hour << ":" << minute << ":" << sec << endl;
    	}
    
    };
    
    Time t; // 定义Time类的对象t
    
    int main()
    {
    	t.set_time(); // 调用对象t的成员函数set_time,向t的数据成员输入数据
    	t.show_time(); // 调用对象t的成员函数show_time,输出t的数据成员的值
    	system("pause");
    	return 0;
    }
    

    在以上程序(第2章习题第2小题)基础上进行修改:
    在类体内声明成员函数,在类外定义成员函数

    ——谭浩强的《C++面向对象程序设计》第2章习题第3小题

    2-3程序

    /*
    ************************************************************************
    @file:    2_3.cpp
    @date:   2020.10.26
    @author: Xiaoxiao
    @brief:   在类体内声明成员函数,在类外定义成员函数
    @blog:    https://blog.csdn.net/weixin_43470383/article/details/109298731	 
    ************************************************************************
    */
    
    #include <iostream>
    using namespace std;
    
    class Time // 声明类类型
    {
    private: // 声明私有部分
    
    	int hour;
    	int minute;
    	int sec;
    
    public: // 声明公用部分
    	
    	// 类内声明成员函数
    	void set_time(void); 
    	void show_time(void);
    };
    
    // 类外定义成员函数
    void Time::set_time(void) // 记得在函数名前面加上类名
    {
    	// 在类外成员函数引用本对象的数据成员时,只需写数据成员名,不需要加类名限定
    	cin >> hour; 
    	cin >> minute;
    	cin >> sec;
    }
    
    void Time::show_time(void)
    {
    	cout << hour << ":" << minute << ":" << sec << endl;
    }
    
    Time t; // 定义Time类的对象t
    
    int main()
    {
    	t.set_time(); // 调用对象t的成员函数set_time,向t的数据成员输入数据
    	t.show_time(); // 调用对象t的成员函数show_time,输出t的数据成员的值
    	system("pause");
    	return 0;
    }
    

    类的成员函数:

    1. 类的成员函数的声明和定义与普通函数基本一样。
      函数声明的一般形式为:
    函数类型 函数名(参数表);
    
    1. 在类体内定义函数时,不需要在函数名前面加上类名;但成员函数在类外定义时,必须在函数名前面加上类名,予以限定。
      比如:
    void Time::show_time(void)
    {
    	cout << hour << ":" << minute << ":" << sec << endl;
    }
    

    在 Time 类外定义成员函数 show_time ,需要在前面加上 Time:: 来限定属于哪个类。

    1. 类的成员函数必须先在类体内声明原型

    2. 在类体内声明成员函数,在类外定义成员函数,是程序设计的一种良好习惯。

    3. 如果在类体中定义的成员函数不包括循环等控制结构,C++系统会自动地对它们作为内置(inline)函数来处理。在类体内定义的函数,一般都省略inline。

    4. 在类体内直接定义函数时,不需要在函数名前面加上类名;如果在类外定义函数,必须在函数名前面加上类名,限定函数所属的类。

    5. 在类外成员函数引用本对象的数据成员时,只需写数据成员名,不需要加类名限定。

    运行结果

    运行结果
    输入:
    22 14 01

    输出:
    22:14:1

    程序实现了功能,并将成员函数从类内定义改成了类外定义。

    展开全文
  • 例如私有的成员函数只能被本中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本中任何成员(包括私有的和公用的),可以引用本作用域中有效的数据。 一般的做法是将需要被外界调用的成员函数指定为...

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

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

    注意:

    1、成员函数需要把实现放在头文件中才会是默认内联函数,如果没有放在头文件中则不会默认是内联;

    2、内联与否,只是你的建议,是否真正内联,得看编译器的意思,写了inline,或者你把类方法实现写在头文件,意味着你希望编译器帮你内联,但是是否真正内联,要看编译器,如果你的内联函数写得很复杂,编译器不一定会帮你内联;

    3、 一般需要重复使用的短小函数用内联。

    展开全文
  • C++中模板中的成员函数以及模板函数在类外定义

    千次阅读 多人点赞 2020-03-05 18:45:07
    但是模板里的成员函数和模板函数与普通的成员函数在类外定义不同。 先定义一个模板以及成员函数和模板函数: 接下我们就在类外定义函数: 1.构造函数 2.成员函数 3.模板函数 以上就是模板中的成员函数以及...
  • C++ 类成员函数定义

    千次阅读 2019-10-29 14:24:52
    编写 C++ 项目时,经常会把整个项目分为多个文件来编写,每个文件作为一个独立的函数模块。 对于定义可将其放在头文件(例如:MyHeader.h)中,而其他的每个文件中直接 #include “MyHeader.h” 即可。 例如...
  • 在类外定义成员函数 成员函数可以在类体中直接定义。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如: class Student { public : void display( ); //公用成员函数原型声明 private : int ...
  • 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;"..."
  • 成员函数(简称函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个的成员,出现在类体中。它可以被指定为private(私有的...
  • C++类成员函数

    千次阅读 2021-06-08 10:00:48
    1 C++类成员函数 1.1 C++类成员函数的性质 成员函数是函数的一种,它的用法和作用和一般函数基本上是一样的,它也有返回值和函数类型。它与一般函数的区别只是:它是属于一个的成员,出现在类体中。它...
  • c++在类外定义函数

    万次阅读 2017-01-09 15:31:48
    c++中有时候中的成员函数过长,那么此时在类定义成员函数就不利于程序的阅读了,此时我们大都会将是函数定义在类外。  c++中规定,在类外定义成员函数时要用类名和作用域运算符进行限定。  如程序:...
  • 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(){ ...
  • c++类的几种成员函数声明后必须要定义吗? 1. 构造函数和析构函数 test.h #pragma once class CTest { public: CTest(); ~CTest(); }; test.cpp #include "stdafx.h" #include "test.h" 情况一: main.cpp #...
  • 函数如下,在C++中声明静态成员变量的时候,在类中只是进行了声明,并没有实际的申请出指针的内存,真正的内存是定义初始化的时候才会进行内存的申请,因此,又因为static类型的变量都是随着的,因此不能随着对象...
  • C++ 静态成员函数

    万次阅读 2020-12-06 18:25:14
    。。。
  • 1. 通过中的public成员函数调用private成员函数: #include<iostream> using namespace std; class Test { public: void fun2() { fun1(); } private: void fun1() { cout<<...
  • 浅谈C++类中6个成员函数

    千次阅读 多人点赞 2021-03-18 15:45:13
    构造函数是一个特殊的成员函数,名字与类名相同且不能有返回值,创建类型时由编译器自动调用,对象的生命周期内只调用一次。**主要任务是初始化对象。 ↓下面是一个简单的构造函数(全缺省): 主函数初始化时...
  • C++成员函数定义方式

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

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

    千次阅读 2020-10-26 17:47:29
    在类内部的typedef
  • c++类的默认成员函数

    千次阅读 2019-05-14 21:23:08
    这些默认的类成员函数, 在类创建的时候, 编译器会自动调用, 但是自动调用并不意味着他们能完成用户所期待的所有任务, 像构造函数, 析构函数, 拷贝构造函数, 赋值重载会某些情况下需要用户根据程序的需要自定义实现...
  • C++ 类成员函数的函数指针

    万次阅读 多人点赞 2018-08-23 18:40:17
    当我们 C++ 中直接像 C 那样使用成员函数指针时,通常会报错,提示你不能使用非静态的函数指针: reference to non-static member function must be called 两个解决方法: 把非静态的成员方法改成静态的...
  • 的数据成员说明对象的特征,而成员函数决定对象的操作行为。 的成员函数有两种定义方法:外联...在类外定义成员函数时必须函数名之前缀上类名,函数名和类名之间加上作用域区分符::,作用域区分符::指明一...
  • 4.如何定义以及访问的方式与普通成员变量和普通成员函数的区别? 5.是怎么分配内存的? 当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不属于某一对象(所有...
  • C++类static成员函数的调用

    千次阅读 2021-10-13 18:08:31
    class中的静态成员函数作用再整个的内部,对应的所有实例是共享静态成员函数的,调用静态成员函数的时候跟调用非静态成员函数是有区别的。另外,静态成员函数只能访问对应内部的静态数据成员,否则会出现...
  • C++结构体和成员函数

    千次阅读 2019-08-02 16:32:45
    1、使用结构体成员变量"."还是“->"的区别? 一般的结构体成员变量访问用"."即可,只用结构体指针访问结构体成员才使用“->" #include <iostream> #include<cstring> using namespace std; ...
  • C++类里面的哪些成员函数是内联函数?

    千次阅读 多人点赞 2018-09-05 19:37:27
    类定义的内联函数分为以下3种: 1.隐式内联 class Person ... void printName()//printName 定义在类里面是隐式内联函数 { cout &lt;&lt; Name &lt;&lt; endl; } private: s...
  • c++在类外调用的私有成员函数的两种方法

    万次阅读 多人点赞 2018-08-02 20:03:50
    1.通过的public成员函数调用private成员函数: #include&lt;iostream&gt; using namespace std; class Test { public: void fun2() { fun1(); } private: void fun1() ...
  • 今天尝试自己实现vector数据结构底层,在定义vector模板的时候,还想像往常一样把分为.h文件和.cpp文件,把成员函数的声明放在.h文件中,把具体实现放在.cpp文件中,结果测试时发现编译过程中报错。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 340,286
精华内容 136,114
关键字:

c++在类外定义成员函数

c++ 订阅