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

成员函数  时间: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); } 除了构造成员函数以外,类还提供了析构成员函数,当对象被从内存中删除时,该成员函数将会被自动调用。

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

杭州王小玉网-美国CERA 2核8G内存19.9元/月,香港,日本E3/16G/20M CN2带宽150元/月,美国宿主机1500元,国内宿主机1200元

官方网站:点击访问王小玉网络官网活动方案:买美国云服务器就选MF.0220.CN 实力 强 强 强!!!杭州王小玉网络 旗下 魔方资源池 “我亏本你引流活动 ” mf.0220.CNCPU型号内存硬盘美国CERA机房 E5 2696v2 2核心8G30G总硬盘1个独立IP19.9元/月 续费同价mf.0220.CN 购买湖北100G防御 E5 2690v2 4核心4G...

BeerVM1GB内存/VDSps端口1GB,350元/月

beervm是一家国人商家,主要提供国内KVM VPS,有河南移动、广州移动等。现在预售湖南长沙联通vds,性价比高。湖南长沙vps(长沙vds),1GB内存/7GB SSD空间/10TB流量/1Gbps端口/独立IP/KVM,350元/月,有需要的可以关注一下。Beervm长沙联通vps套餐:长沙联通1G青春版(预售)长沙联通3G标准版(预售)长沙联通3G(预售)vCPU:1vCPU:2vCPU...

ZJI(月付480元),香港阿里云专线服务器

ZJI是成立于2011年原Wordpress圈知名主机商—维翔主机,2018年9月更名为ZJI,主要提供香港、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册业务。本月商家针对香港阿里云线路独立服务器提供月付立减270-400元优惠码,优惠后香港独立服务器(阿里云专线)E3或者E5 CPU,SSD硬盘,最低每月仅480元起。阿里一型CPU:Intel E5-2630L...

成员函数为你推荐
在线协同办公qq 有协同办公功能吗统一身份认证的好处实名认证的好处有哪些?网站推广120种方法网络推广是做些什么??具体……流动比率计算公式流动比率和速动比率公式是怎么的啊,怎么计算啊?新中大软件新中大财务软件的账套管理系统在哪女网管我们这有个女网管很漂亮,20岁。我很想,他可能是处?我该怎么追她?求大家帮忙交通信号灯控制系统什么是智能交通信号灯交通信号灯控制系统求一完成的红绿灯PLC设计,要求有图和简单原理天津职业大学地址天津职业大学,怎么样,多少分能进去。云龙数码云龙易购是什么模式??
免费国内空间 100m网站空间 域名主机空间 韩国服务器租用 重庆服务器租用 cn域名备案 七牛优惠码 godaddy优惠券 云主机51web 大容量存储 福建天翼加速 有奖调查 softbank邮箱 免费防火墙 共享主机 广州服务器 空间合租 如何用qq邮箱发邮件 太原联通测速 智能dns解析 更多