成员函数请问什么是成员函数的定义?

成员函数  时间:2021-09-27  阅读:()

什么叫成员函数?有什么作用?

c++ primer中在讲构造函数初始化列表的时候有这么一段话: 无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。

不同之处在于,使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数体中对数据成员赋值。

请问这里的初始化数据成员与对数据成员赋值的含义是什么?有什么区别? 我知道在数据成员有默认构造函数时是有不同的,但对其他类型的成员呢?其他类型成员的初始化和赋值有区别吗? ======================================================================================== 是这个意思: 首先把数据成员按类型分类 1。

内置数据类型,复合类型(指针,引用) 2。

用户定义类型(类类型) 分情况说明: 对于类型1,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的 对于类型2,结果上相同,但是性能上存在很大的差别 因 为类类型的数据成员对象在进入函数体是已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,这是调用一个构造函数,在进入函数体之后,进行的是 对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为) 举个例说明 class a; class b {public: b(){a = 3;} private: a a; } class a {public: a(){} a(int){value = 3;} int value; } 像上面,我们使a对象的value为3,调用一个a的构造函数+一个默认拷贝赋值符,才达到目的 b::b():a(3){} 像这样,只调用了一个构造函数就达到了所需的对象啦,所以性能好的 转载他人一篇 我的问题是关于初始化c++类成员的。

我见过许多这样的代码(包括在你的栏目中也见到过): csomeclass::csomeclass() { x=0; y=1; } 而在别的什么地方则写成下面的样子: csomeclass::csomeclass() : x(0), y(1) { } 我的一些程序员朋友说第二种方法比较好,但他们都不知道为什么是这样。

你能告诉我这两种类成员初始化方法的区别吗? 回答 从技术上说,你的程序员朋友是对的,但是在大多数情况下,两者实际上没有区别。

有两个原因使得我们选择第二种语法,它被称为成员初始化列表:一个原因是必须的,另一个只是出于效率考虑。

让我们先看一下第一个原因——必要性。

设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。

class cmember { public: cmember(int x) { ... } }; 因为cmember有一个显式声明的构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建cmember的一个实例。

cmember* pm = new cmember; // error!! cmember* pm = new cmember(2); // ok 如果cmember是另一个类的成员,你怎样初始化它呢?你必须使用成员初始化列表。

class cmyclass { cmember m_member; public: cmyclass(); }; //必须使用成员初始化列表 cmyclass::cmyclass() : m_member(2) { ??? } 没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。

根据c++的规则,常量对象和引用不能被赋值,它们只能被初始化。

第二个原因是出于效率考虑,当成员类具有一个缺省的构造函数和一个赋值操作符时。

mfc的cstring提供了一个完美的例子。

假定你有一个类cmyclass具有一个cstring类型的成员m_str,你想把它初始化为"yada yada."。

你有两种选择: cmyclass::cmyclass() { // 使用赋值操作符 // cstring::operator=(lpctstr); m_str = _t("yada yada"); } //使用类成员列表 // and constructor cstring::cstring(lpctstr) cmyclass::cmyclass() : m_str(_t("yada yada")) { } 在 它们之间有什么不同吗?是的。

编译器总是确保所有成员对象在构造函数体执行之前初始化,因此在第一个例子中编译的代码将调用cstring:: cstring来初始化m_str,这在控制到达赋值语句前完成。

在第二个例子中编译器产生一个对cstring:: cstring(lpctstr)的调用并将"yada yada"传递给这个函数。

结果是在第一个例子中调用了两个cstring函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。

在 cstring的例子里这是无所谓的,因为缺省构造函数是内联的,cstring只是在需要时为字符串分配内存(即,当你实际赋值时)。

但是,一般而言, 重复的函数调用是浪费资源的,尤其是当构造函数和赋值操作符分配内存的时候。

在一些大的类里面,你可能拥有一个构造函数和一个赋值操作符都要调用同一个负 责分配大量内存空间的init函数。

在这种情况下,你必须使用初始化列表,以避免不要的分配两次内存。

在内部类型如ints或者longs或者其它没有构 造函数的类型下,在初始化列表和在构造函数体内赋值这两种方法没有性能上的差别。

不管用那一种方法,都只会有一次赋值发生。

有些程序员说你应该总是用初始 化列表以保持良好习惯,但我从没有发现根据需要在这两种方法之间转换有什么困难。

在编程风格上,我倾向于在主体中使用赋值,因为有更多的空间用来格式化和 添加注释,你可以写出这样的语句:x=y=z=0; 或者memset(this,0,sizeof(this)); 注意第二个片断绝对是非面向对象的。

当我考虑初始化列表的问题时,有一个奇怪的特性我应该警告你,它是关于c++初始化类成员的,它们是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

class cmyclass { cmyclass(int x, int y); int m_x; int m_y; }; cmyclass::cmyclass(int i) : m_y(i), m_x(m_y) { } 你 可能以为上面的代码将会首先做m_y=i,然后做m_x=m_y,最后它们有相同的值。

但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺 序声明的。

结果是m_x将有一个不可预测的值。

我的例子设计来说明这一点,然而这种bug会更加自然的出现。

有两种方法避免它,一个是总是按照你希望它们 被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。

这将有助于消除混淆。

使用成员函数需要注意哪些特点

在类中定义成员函数,它所带的参数可以只指出类型,而省略实参名;在类外定义成员函数必须前面加上类名,再加两个冒号,再写上成员函数名。

如果不加双冒号,成员函数就变成全局函数。

静态成员函数和非静态成员函数的区别

静态函数只有当程序结束的时候才从内存消失。

而非静态则是动态加载到内存,不需要的时候就从内存消失。

据个例子,调用类中的静态函数,你不需要创建对象就可以调用。

而对于非静态的函数,你必须要先创建对象,才能够由对象调用。

Class::func() //对于静态函数不创建对象,可以这样调用,而非静态必须创建对象。

成员函数和普通函数的所有区别

区别很大: 1.成员函数是面向对象的概念,所谓的成员函数,是指一个函数作为类的成员,公有成员、私有成员或者保护成员。

2.普通函数一般有两种传递方式,按类型传递和按值传递,也就是传指针和传返回值两种情况。

成员函数一般是按类型传递,也即是传指针地址 3.普通函数可以随便调用,并且无法继承和封装,成员函数根据类的不同,可以进行继承,根据公有私有的不同,调用方式也不同 4.深层次的区别,普通函数作为C语言的概念,用的是stdlib,成员函数是用iostream,编译方法不同,至于谁占内存多,并不好说,也不是说面向对象的就占内存大些,还是看具体的环境和编译器。

5.嵌入式的编程,用普通函数较多,成员函数较少,当然ARM嵌入linux那种例外 大体上能一下子想到的只有这么多了 函数是否分配内存,看变量,这个问题,我得详细解释一下,你是否熟悉汇编?知道不知道函数字段这个概念,也就说,所有函数都是分配在一段共享字段里面的,也就是你所说的内存,其实不仅仅是内存,包括闪存等等都可以包含,所以是占用了一段空间的,只是这段空间不一定在内存内,可能在闪存内,也可能在硬盘内,这么说,你清楚吗?

请问什么是成员函数的定义?

成员函数相当于C或C++中的函数。

你应该用如下的方式说明一个成员函数: Type name (Parameter) //function body 注意:每一个成员函数必须返回一个值或声明返回为空(void)。

它返回类型的说明告诉编译器它将返回什么类型的值。

在某些情况下,成员函数需要表示它是否成功的完成了它的工作,此时返回类型通常为布尔型的。

参数表是用逗号分开的一组变量,它将为成员函数提供所需信息。

下面例子中定义了一个成员函数。

通过它,你的矩形类可以计算自己的面积了: int getArea(int w,int h) { int a; a=w*h; return a; } 另外,矩形还需要对自己进行描绘,因此它需要成员函数drawRect(),此时,你的矩形类的定义将如下所示: public class DrwRect { public static void main(String args[]) { class Rectangle { int width,height,area; public Rectangle(int w,int h) { width=w; height=h; area=getArea(w,h); } protected int getArea(int w,int h) { int a; a=w*h; return a; } public void drawRect() { int i,j; for(i=width;i>0;i--) System.out.print("#"); System.out.print("") ; for(i=height-2;i>0;i--) System.out.print("#"); for(j=width-2;i>0;j--) System.out.print(""); System.out.print("#"); for(i=width;i>0;i--) System.out.print("#"); System.out.print(""); } } //Rectangle int w=Integer.valueOf(args[0]).intValue(); int h=Integer.valueOf(args[1]).intValue(); Rectangle myrect=new Rectangle(w,h); myrect.drawRect(); } } 上例中最后一个“#”号后面还有一个System.out.print("")这是由于这个成员函数在上一行没有结束而且缓冲区没有溢出时将不把输出结果写屏。

若你使用print成员函数,却没有得到输出,这时仔细确认一下你是否以""来结束你的输出流。

2:不同类型的成员函数 在上例的成员函数声明中你需要注意两点:getArea()定义为private型,drawRect()定义为public型。

public型意味着任何类都可以调用它。

private型,它只能被所声明的类内部调用。

这些说明类型同样适用于数据变量。

若有人想改变一个私有变量,通常要引用下面的成员函数: public void setWidth(int w) { width=w; } 注意:在Java中,protected只是作为关键字出现,而没有相应的功能。

3:成员函数的重载 假如你必须在不同情况下发送不同的信息给同一个成员函数的话,该怎么办呢?你可以通过对此成员函数说明多个版本(version)的方法来实现重载。

重载的本质是创建了一个新的成员函数:你只需给它一个不同的参数列表(parameterlist),如下例所示: void get Area(int w,int h); void get Area(float w,float h); 在第二种情况下,成员函数get Area()接受两个浮点变量作为它的参数,编译器根据调用时的不同参数来决定该调用哪一种成员函数,假如你把两个整数提供给成员函数,你就调用第一个成员函数;假如你把两个浮点数提供给成员函数,第二个成员函数就被调用。

4:静态成员 除了public、private和protected以外,你还可以把成员说明为static(静态)。

static修饰符表明一个变量或成员函数对所有类的实例都是相同的,你也许想使用一个所有Rectangle类都可以使用的变量,来说明该类的版本(version),假如你把它说明成一个static,那么该变量将对该类的所有实例都是一样的,如: static int version=1; 静态成员函数和静态变量的优点就在于他们能在没有创建类的任何一个实例的情况下被引用,引用时在“.”域前,可直接使用类名而无须使用对象名。

例如,drawRect成员函数使用了System.out.println成员函数,但实际上你却未曾创建一个某个System类的对象,这正是因为out是System类的一个静态变量,所以你可以直接使用这个成员函数而无须定义一个System对象。

5:构造和析构成员函数 类有一个特殊的成员函数叫做构造成员函数,它通常用于初始化类的数据成员。

在创建对象时,会自动调用类的构造成员函数。

Java中的构造成员函数必须与该类具有相同的名字,另外,构造成员函数一般都应用public类型来说明,这样才能在程序任意的位置创建类的实例--对象。

下面是一个Rectangle类的构造成员函数,它带有两个参数,分别表示矩形的长和宽: public Rectangle(int w,int h) { width=w; height=h; area=getArea(w,h); } 除了构造成员函数以外,类还提供了析构成员函数,当对象被从内存中删除时,该成员函数将会被自动调用。

通常,在析构成员函数内,你可以填写用来回收对象内部的动态空间的代码。

95IDC香港特价物理机服务器月付299元起,5个ip/BGP+CN2线路;美国CERA服务器仅499元/月起

95idc是一家香港公司,主要产品香港GIA线路沙田CN2线路独服,美国CERA高防服务器,日本CN2直连服务器,即日起,购买香港/日本云主机,在今年3月份,95IDC推出来一款香港物理机/香港多ip站群服务器,BGP+CN2线路终身7折,月付350元起。不过今天,推荐一个价格更美的香港物理机,5个ip,BGP+CN2线路,月付299元起,有需要的,可以关注一下。95idc优惠码:优惠码:596J...

Budgetvm12核心 16G 500 GB SSD 或者 2 TB SATA 10GB  20 TB  99美金

Budgetvm(原EZ机房),2005年成立的美国老品牌机房,主打美国4个机房(洛杉矶、芝加哥、达拉斯、迈阿密)和日本东京机房的独立服务器和VPS业务,而且不限制流量,默认提供免费的1800G DDoS防御服务,支持IPv6和IPMI,多种免费中文操作系统可供选择,独立服务器主打大硬盘,多硬盘,大内存,用户可以在后台自行安装系统等管理操作!内存可定制升级到1536G,多块硬盘随时加,14TBSA...

EdgeNat 新年开通优惠 - 韩国独立服务器原生IP地址CN2线路七折优惠

EdgeNat 商家在之前也有分享过几次活动,主要提供香港和韩国的VPS主机,分别在沙田和首尔LG机房,服务器均为自营硬件,电信CN2线路,移动联通BGP直连,其中VPS主机基于KVM架构,宿主机采用四路E5处理器、raid10+BBU固态硬盘!最高可以提供500Gbps DDoS防御。这次开年活动中有提供七折优惠的韩国独立服务器,原生IP地址CN2线路。第一、优惠券活动EdgeNat优惠码(限月...

成员函数为你推荐
移动互联我是大专生,专业是移动互联应用技术。看问题补充统一身份认证的好处实名认证的好处有哪些?新中大软件scratch软件是干什么的暴风播酷云暴风影音播放过的在线视频放在哪个文件夹里中山大学南校区地址谁知道中山大学的具体位置?要详细的地址!急!!!无线监控方案智能汽车充电桩无线监控方案怎么实现?交通智能网智能网联汽车关键技术?上海长宽上海电信,与长宽有什么区别,现在有几种网络宽带,怎么申请csol进不去为什么我下了csol打不开l六间房六间房秀场怎么赚钱
me域名注册 下载虚拟主机 域名空间购买 vps虚拟服务器 老域名全部失效请记好新域名 便宜域名 68.168.16.150 2017年万圣节 圣诞节促销 新天域互联 股票老左 183是联通还是移动 699美元 php空间购买 中国域名 万网空间 徐州电信 电信宽带测速软件 腾讯云平台 .htaccess 更多