-
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。
更多相关内容 -
【C++之成员函数】类外定义成员函数
2020-10-26 22:44:49题目要求: 在以上程序(第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; }
类的成员函数:
- 类的成员函数的声明和定义与普通函数基本一样。
函数声明的一般形式为:
函数类型 函数名(参数表);
- 在类体内定义函数时,不需要在函数名前面加上类名;但成员函数在类外定义时,必须在函数名前面加上类名,予以限定。
比如:
void Time::show_time(void) { cout << hour << ":" << minute << ":" << sec << endl; }
在 Time 类外定义成员函数 show_time ,需要在前面加上 Time:: 来限定属于哪个类。
-
类的成员函数必须先在类体内声明原型。
-
在类体内声明成员函数,在类外定义成员函数,是程序设计的一种良好习惯。
-
如果在类体中定义的成员函数不包括循环等控制结构,C++系统会自动地对它们作为内置(inline)函数来处理。在类体内定义的函数,一般都省略inline。
-
在类体内直接定义函数时,不需要在函数名前面加上类名;如果在类外定义函数,必须在函数名前面加上类名,限定函数所属的类。
-
在类外成员函数引用本对象的数据成员时,只需写数据成员名,不需要加类名限定。
运行结果
输入:
22 14 01输出:
22:14:1程序实现了功能,并将成员函数从类内定义改成了类外定义。
- 类的成员函数的声明和定义与普通函数基本一样。
-
C++类的成员函数(在类外定义成员函数)
2021-04-25 21:37:04类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍...例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为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行的函数,一般在类体内声明,在类外定义。
-
C++之类外定义成员函数、inline成员函数详解
2017-02-23 22:19:29例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。 一般的做法是将需要被外界调用的成员函数指定为...在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。
一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。但应注意,并非要求把所有成员函数都指定为public。有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为private。这种函数的作用是支持其它函数的操作,是类中其它成员的工具函数(utility function),类外用户不能调用这些私有的工具函数。
类的成员函数是类体中十分重要的部分。如果一个类中不包含成员函数,就等同于C语言中的结构体了,体现不出类在面向对象程序设计中的作用。在类外定义成员函数
在前面已经看到成员函数是在类体中定义的。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如:
1234567891011121314151617class
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,因为这些成员函数已被隐含地指定为内置函数。如:12345678910111213class
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作显式声明。如:123456789101112class
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++ 类 :类成员函数定义
2019-10-29 14:24:52在编写 C++ 项目时,经常会把整个项目分为多个文件来编写,每个文件作为一个独立的函数模块。 对于类的定义可将其放在头文件(例如:MyHeader.h)中,而在其他的每个文件中直接 #include “MyHeader.h” 即可。 例如... -
C++:类的成员函数定义方式
2017-09-07 10:08:001、成员函数的第一种定义方式:在类声明中只给出成员函数的原型,而将成员函数的定义放在类的外部。返回值类型 类名::成员函数名(参数表){ 函数体} class Point{ public: void setpoint(int,int); //设置坐标... -
C++的成员函数声明与定义 —— 类外定义成员函数以及inline函数
2018-08-08 01:04:51类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为private(私有的... -
C++中模板类中的成员函数以及模板函数在类外定义
2020-03-05 18:45:07在C++中,类中的成员函数可以在类外完成定义,从而显得类中的成员函数看起来简洁明了。但是模板类里的成员函数和模板函数与普通的成员函数在类外定义不同。 先定义一个模板类以及成员函数和模板函数: 接下我们就在... -
C++类的成员函数(在类外定义成员函数、inline成员函数)
2018-05-12 23:18:18在类外定义成员函数 成员函数可以在类体中直接定义。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如: class Student { public : void display( ); //公用成员函数原型声明 private : int ... -
C++之类内定义成员函数
2018-05-11 09:58:52#include <iostream>using namespace std;class Student{public: void get() { cin>>age>>name; } void display() { cout<<"..." -
c++类的默认成员函数
2019-05-14 21:23:08这些默认的类成员函数, 在类创建的时候, 编译器会自动调用, 但是自动调用并不意味着他们能完成用户所期待的所有任务, 像构造函数, 析构函数, 拷贝构造函数, 赋值重载会在某些情况下需要用户根据程序的需要自定义实现... -
C++类的成员函数
2021-06-08 10:00:481 C++类的成员函数 1.1 C++类成员函数的性质 类的成员函数是函数的一种,它的用法和作用和一般函数基本上是一样的,它也有返回值和函数类型。它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它... -
c++类的几种成员函数声明后必须要定义吗?
2019-07-10 14:23:59c++类的几种成员函数声明后必须要定义吗? 1. 构造函数和析构函数 test.h #pragma once class CTest { public: CTest(); ~CTest(); }; test.cpp #include "stdafx.h" #include "test.h" 情况一: main.cpp #... -
关于在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++ 类成员函数的函数指针
2018-08-23 18:40:17当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用非静态的函数指针: reference to non-static member function must be called 两个解决方法: 把非静态的成员方法改成静态的... -
C++ 的静态成员变量为什么一定要在类外定义
2020-10-08 00:20:26函数如下,在C++中声明静态成员变量的时候,在类中只是进行了声明,并没有实际的申请出指针的内存,真正的内存是定义初始化的时候才会进行内存的申请,因此,又因为static类型的变量都是随着类的,因此不能随着对象... -
C++学习(三) C++类中成员函数的定义
2017-11-28 13:18:01类的数据成员说明对象的特征,而成员函数决定对象的操作行为。 类的成员函数有两种定义方法:外联...在类外定义成员函数时必须在函数名之前缀上类名,在函数名和类名之间加上作用域区分符::,作用域区分符::指明一... -
浅谈C++类中6个成员函数
2021-03-18 15:45:13构造函数是一个特殊的成员函数,名字与类名相同且不能有返回值,创建类类型时由编译器自动调用,在对象的生命周期内只调用一次。**主要任务是初始化对象。 ↓下面是一个简单的构造函数(全缺省): 主函数初始化时... -
c++中在类外定义函数
2017-01-09 15:31:48c++中有时候类中的成员函数过长,那么此时在类内定义成员函数就不利于程序的阅读了,此时我们大都会将是函数定义在类外。 c++中规定,在类外定义成员函数时要用类名和作用域运算符进行限定。 如程序:... -
C++之在类外定义成员函数
2018-05-11 10:27:13#include <iostream>using namespace std;class Student{public: void get(); void display();private: int age; string name;};void Student::get(){ cin&...}void Student::display(){ ... -
c++在类外调用类的私有成员函数的两种方法
2019-01-09 16:09:181.通过类的public成员函数调用private成员函数: #include<iostream> using namespace std; class Test { public: void fun2() { fun1(); } private: void fun1() ... -
C++ : 类的成员函数修改类中数据成员值
2020-12-07 15:24:37遇到一个问题是:在类中有一个数据成员,是public的,在类的成员函数中进行修改,这个类的成员函数可能是要调用多次,想知道是不是每一次调用都有效 写了一个测试函数: #include <iostream> #include "cv... -
DEV C++类的成员函数声明,定义和实现
2019-09-11 15:34:021:类体内声明并定义成员函数 法1)新建项目–>Console Aplication–>项目名称 在“项目管理”下,选择“添加文件夹”(也可以直接NEW FILE,添加文件夹主要是方便管理,这个文件夹专门放头文件) 在新文件夹... -
C++静态成员函数
2019-05-01 17:17:30一点睛 与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员。 静态成员函数没有this指针。...由此决定了静态成员函数不能访问本类中的非静态成员。 静... -
c++私有成员函数_C ++中的私有成员函数示例
2020-07-10 12:00:57c++私有成员函数 私人会员功能 (Private Member Function) A function declared inside the class's private section is known as "private member function". A private member function is accessible through the... -
C++类模板类成员的类外定义方法
2019-09-05 16:18:23举个栗子: template<typename T>//代表这是个类模板 class BinaryTree { public: BinaryTree(); ~BinaryTree();... //类模板内成员定义 } private: }; /*类模板的构造函... -
c++中模板类的成员函数的声明与定义应该放在头文件里
2018-11-14 14:08:36今天尝试自己实现vector数据结构底层,在定义vector模板类的时候,还想像往常一样把类分为.h文件和.cpp文件,把成员函数的声明放在.h文件中,把具体实现放在.cpp文件中,结果在测试时发现在编译过程中报错。... -
C++ 函数模板作为类模板的成员函数
2019-08-01 22:19:48/****************类模板***/ #include <iostream> using namespace std; template <class T1,class T2> class Pair { public: T1 key;//关键字 T2 value;//值 Pair(T1 k,T2 v):key(k),v...