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

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

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

弘速云20.8元/月 ,香港云服务器 2核 1g 10M

弘速云元旦活动本公司所销售的弹性云服务器、虚拟专用服务器(VPS)、虚拟主机等涉及网站接入服务的云产品由具备相关资质的第三方合作服务商提供官方网站:https://www.hosuyun.com公司名:弘速科技有限公司香港沙田直营机房采用CTGNET高速回国线路弹性款8折起优惠码:hosu1-1 测试ip:69.165.77.50​地区CPU内存硬盘带宽价格购买地址香港沙田2-8核1-16G20-...

华纳云不限流量¥324/年,香港双向CN2(GIA)云服务器/1核1G/50G存储/2Mbps

华纳云(HNCloud Limited)是一家专业的全球数据中心基础服务提供商,总部在香港,隶属于香港联合通讯国际有限公司,拥有香港政府颁发的商业登记证明,保证用户的安全性和合规性。 华纳云是APNIC 和 ARIN 会员单位。主要提供香港和美国机房的VPS云服务器和独立服务器。商家支持支付宝、网银、Paypal付款。华纳云主要面向国内用户群,所以线路质量还是不错的,客户使用体验总体反响还是比较好...

欧路云:美国200G高防云-10元/月,香港云-15元/月,加拿大480G高防云-23元/月

欧路云 主要运行弹性云服务器,可自由定制配置,可选加拿大的480G超高防系列,也可以选择美国(200G高防)系列,也有速度直逼内地的香港CN2系列。所有配置都可以在下单的时候自行根据项目 需求来定制自由升级降级 (降级按天数配置费用 退款回预存款)。由专业人员提供一系列的技术支持!官方网站:https://www.oulucloud.com/云服务器(主机测评专属优惠)全场8折 优惠码:zhuji...

成员函数为你推荐
宝安网站制作宝安网站制作网络公司哪家比较好即时通讯软件开发即时通信软件怎么样?哪家做得好?陕西理工学院地址陕西理工学院南区的具体地址是什么?400电话会议收费400电话会议收费吗网站推广120种方法企业如何做网站推广流动比率计算公式流动比率和速动比率公式是怎么的啊,怎么计算啊?女网管我们这有个女网管很漂亮,20岁。我很想,他可能是处?我该怎么追她?求大家帮忙交通信号灯控制系统如何控制交通信号灯洛奇英雄传s2洛奇英雄传传奇套装在第二季还会贵么例外招聘深圳富市康还招工吗是不是只要女孩不要男孩的呢,待遇好吗?
n点虚拟主机管理系统 mobaxterm 建站代码 空间服务商 彩虹ip 空间论坛 百兆独享 爱奇艺vip免费试用7天 cdn加速是什么 网站在线扫描 双线asp空间 ebay注册 域名转入 supercache 1美元 免备案cdn加速 wordpress空间 .htaccess restart godaddy中文 更多