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

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

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

CheapWindowsVPS$4.5/月,美国VPS/免费Windows系统/1Gbps不限流量/,可选美洲、欧洲、亚洲等8大机房

国外商家提供Windows系统的并不常见,CheapWindowsVPS 此次提供的 2 款 VPS 促销套餐,提供 5 折永久优惠码,优惠后月付 4.5 美元起,价格还是挺诱人的,VPS 不限流量,接入 1Gbps 带宽,8 个机房皆可选,其中洛杉矶机房还提供亚洲优化网络供选择,操作系统有 Windows 10 专业版、2012 R2、2016、Linux等。Cheap Windows VPS是...

Contabo美国独立日促销,独立服7月€3.99/月

Contabo自4月份在新加坡增设数据中心以后,这才短短的过去不到3个月,现在同时新增了美国纽约和西雅图数据中心。可见Contabo加速了全球布局,目前可选的数据中心包括:德国本土、美国东部(纽约)、美国西部(西雅图)、美国中部(圣路易斯)和亚洲的新加坡数据中心。为了庆祝美国独立日和新增数据中心,自7月4日开始,购买美国地区的VPS、VDS和独立服务器均免设置费。Contabo是德国的老牌服务商,...

老周互联24小时无理由退款,香港原生IP,28元起

老周互联怎么样?老周互联隶属于老周网络科技部旗下,创立于2019年12月份,是一家具有代表性的国人商家。目前主营的产品有云服务器,裸金属服务器。创办一年多以来,我们一直坚持以口碑至上,服务宗旨为理念,为用户提供7*24小时的轮班服务,目前已有上千多家中小型站长选择我们!服务宗旨:老周互联提供7*24小时轮流值班客服,用户24小时内咨询问题可提交工单,我们会在30分钟内为您快速解答!另免费部署服务器...

成员函数为你推荐
华为开发者联盟华为开发者联盟推出的华为推送有什么优势啊?drs系统什么叫做SCM系统?drs系统什么是ABS系统产品涨价通知调价通知函怎么写无线监控方案智能汽车充电桩无线监控方案怎么实现?亚网路亚钓鱼的时间问题洛奇英雄传s2洛奇英雄传s2茉莉花哪里弄洛奇英雄传s2洛奇英雄传有办法不交s2的任务,然后反复刷s2的图吗?动易系统动易网站管理系统的首页INDEX.ASP 修改超声波探测什么情况下要超声波探伤?
万网域名空间 万网域名证书查询 轻博客 主机合租 免费smtp服务器 炎黄盛世 什么是刀片服务器 超级服务器 免费外链相册 我的世界服务器ip 数据库空间 免费php空间 电信宽带测速软件 免费主页空间 好看的空间 小夜博客 塔式服务器 美国主机 phpwind论坛 ipower 更多