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

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

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

DMIT(季度$28.88)调整洛杉矶CN2 GIA优化端口

对于DMIT商家已经关注有一些时候,看到不少的隔壁朋友们都有分享到,但是这篇还是我第一次分享这个服务商。根据看介绍,DMIT是一家成立于2017年的美国商家,据说是由几位留美学生创立的,数据中心位于香港、伯力G-Core和洛杉矶,主打香港CN2直连云服务器、美国CN2直连云服务器产品。最近看到DMIT商家有对洛杉矶CN2 GIA VPS端口进行了升级,不过价格没有变化,依然是季付28.88美元起。...

免费注册宝塔面板账户赠送价值3188礼包适合购买抵扣折扣

对于一般的用户来说,我们使用宝塔面板免费版本功能还是足够的,如果我们有需要付费插件和专业版的功能,且需要的插件比较多,实际上且长期使用的话,还是购买付费专业版或者企业版本划算一些。昨天也有在文章中分享年中促销活动。如今我们是否会发现,我们在安装宝塔面板后是必须强制我们登录账户的,否则一直有弹出登录界面,我们还是注册一个账户比较好。反正免费注册宝塔账户还有代金券赠送。 新注册宝塔账户送代金券我们注册...

spinservers:10Gbps带宽高配服务器月付89美元起,达拉斯/圣何塞机房

spinservers是一家主营国外服务器租用和Hybrid Dedicated等产品的商家,Majestic Hosting Solutions LLC旗下站点,商家数据中心包括美国达拉斯和圣何塞机房,机器一般10Gbps端口带宽,且硬件配置较高。目前,主机商针对达拉斯机房机器提供优惠码,最低款Dual E5-2630L v2+64G+1.6TB SSD月付89美元起,支持PayPal、支付宝等...

成员函数为你推荐
科达视频会议科达视频会议系统是否支持指挥调度?华为网盘帐号华为云账号是qq邮箱怎么验证不了oa地址请问中粮的OA系统地址是什么?杭州工作室杭州有特色的工作室?哪家拍婚纱照服务好?平顶山教务管理系统河南省教师教育培训管理系统如何操作?高清网络球机高清网络半球摄像机、快球摄像机、枪机的区别在哪锁云《骗子X攻略X穿越》写的是什么内容?l六间房六间房的名称由来会议管理平台会议推广用什么软件好wap地带怎样使用WAP、
独立ip虚拟主机 查域名 如何申请域名 vps推荐 浙江vps bandwagonhost 账号泄露 typecho 中国智能物流骨干网 元旦促销 cpanel空间 dux 北京双线机房 百度云1t 腾讯总部在哪 网通服务器 河南移动梦网 什么是web服务器 lamp兄弟连 免费蓝钻 更多