构造函数的意义是初始化数据成员,可是不是应该用0或者确定的东西来初始化么?

为什么这里会用n来初始化num,用nam来初始化name,还有用s来初始化sex?意义何在?既然初始化了还是个不确定的东西,为什么要初始化,直接用name,sex,num就好了,何必多此一举呀?

觉得很奇怪,求大佬解答一下,非常感谢╰(*′︶`*)╯


类用来产生对象。

同一个类可以产生许多不同的对象。

每个对象诞生(构造)时,有可能各不相同。

你,我,小明,苍老师,都是人类。

是人类的四个对象。

当这四个对象出生,他们都哇哇地哭。

都有脸有鼻子有手有脚。

但也有不同。

比如我有带把,小苍老师没有。

比如同样带把,我初始化时就有8cm。

而小明是0.8cm,你……医生拿来了放大镜,又无奈地丢弃,「快,实验室拿显微镜……」

这一切不同来自谁?

当然是上帝,

上帝调用了人类一个拥有265个入参的构造函数。

那些入参它们有一个神秘的名字。叫基因。

总之,类往往需要有一种能力,让调用者可在对象产生的时候就各不相同。

(本就应该如此嘛)

大千世界,万事万物的构造本就如此,所以c++的构造函数不一定将整数成员初始化为零,不一定将浮点数初始化为8.0 (0.8,0.000008以及0.0都有可能呀),这有什么奇怪的吗?

反过来才奇怪甚至恐慌的吧?!

每个中国人从医生怀中抱过来,

都是一个模子……

然后,

「来,家长,选一下,我院最新6万个初始化套餐可选,初始化医生来自韩国和泰国……」

……

你之所以无法第一时间理解「构造函数入参之于新对象之差异化」的作用,

很大部分的原因,

是因为,

年轻人,你把参数都传到了墙上,纸上。

你,还没有真正地,构造过一个人。

若有一天,你立在产床前,看著帅气强壮的宝宝,你哆嗦地掏出显微镜递给医生,医生微笑摇头:「无需,肉眼可识别。」

惊喜欲狂,感谢上苍!

彼时,你自然就懂得,构造一个对象时,为什么要可以传参数,又为什么这些个参数要落实到新对象身上的各个成员。

……

所谓 ——

人情练达好代码,世事洞悉通编程。

C++是世界上最入世的编程语言,恐怕没有之一,在我有生之年。

想从根子上学自然而然,快快乐乐(偶尔要接受调侃)地学好c++,为什么不买一本《白话C++》的上册呢?

坦诚地说,你问的和我答的,都只是皮毛,以至于我为自己强答这么长内容(明眼人看出是为了埋广告)而害臊。

所以我觉得应该由简单的问题,带出点关键的知识。

来提出「类的不变式」,这几乎是面向对象封装的唯一重点。构造时初始化,除了是对象初始差异化的手段之一,更需要注意在对象创建时就满足类的不变式。

在《白话C++》之练功(也就是上册)的第666页。


num等都是类成员变数。

初始化后就会记住这个值,以后用起来方便

而函数入口变数离开了函数后,类实体就不再与它有关系了。

你是希望类实体自己记住这些事,还是别人帮类实体记住这些事?

另外,从这个例子看,这本书是粗制滥造的垃圾书。


你要把一个类初始化成一个对象。比如说,现在有一个类,类名是人。你需要使用的时候需要把他进行实例化(构造函数),赋予他姓名、性别、出生日期等等属性。他才成为了一个【实例】,成为了某一个存在的人,才能够被调用。

构造函数里的参数就是用来赋值这些属性的。你可以赋值给一个变数叫姓名、年龄……。但是无法知道这个变数是归属于谁的,谁的姓名都可以是姓名都可以name。

面向对象,就是把这些构成特殊体的属性汇集到一起,形成了【类和对象】的概念。

另外一个问题是,类的定义和声明的时候,类的对象还没有产生。你需要在main里调用到类的构造方法以后。才会有类的对象产生,所以,构造函数是传的型参,你还不知道要给他起名叫什么,只有等他出生了以后才起名,当然你也可以写死他的属性,比如构造函数里写死某个性别为男,那么调用构造函数生产的对象,就全部都是男性了。


泻药。题主希望每次生成的学生编号都是0吗?如果不是的话当然得用n啊,n,nam和s作为构造函数传进来表示你在构造一个学生的时候就可以设定这个学生的编号,姓名,以及性别。

比如下面这段代码会显示学生1编号编号为7,学生2编号为14。如果用num = 0的话初始化的编号都只能是0了。

#include &

using namespace std;

class Student {
public:
Student(int n, string nam, char s) {
num = n;
name = nam;
sex = s;
}

int getNum() {
return num;
}

protected:
int num;
string name;
char sex;
};

int main() {
Student student1(7, "Liu", m);
cout & " & " &


这个构造函数就是全部参数都赋值了,你也可以设置默认值,你也可以写无参构造函数,无参构造就像你说的你可以全部赋值0或者空,另外你这三个变数都是private,后续你是无法直接访问的,你不赋值,那你就写几个函数去操作这几个变数,或者改成public直接操作。

c++很自由,你想干啥都行啊,你觉得这个构造函数不行,你可以随便重载~stl初始化方法也不止一种。


你可能对函数的形参、实参还没有懂。

比如我定义一个函数。

int fun1(int a){
int b = a;
int c = a + 2;
return b * c;
}

上边的 a 在调用之前,代表几始终是不确定的,所以就形参,只是一个形式。它的作用在调用它的时候才显现出来。

int b = 3;
fun1(b); //这里的 b 就叫做实参,实实在在的参数,有一个确定的值。
然后上边的包含 a 的地方就可以按下边的样子理解
int fun1(3){
int b = 3;
int c = 3 + 2;
return b * c;
}

所以调用的时候它就是一个确定的数字了。

你说的构造函数 num = n

n 就是一个形参,调用它之前确实是一个不确定的数,但调用它的时候,它一定接受了一个实参,成为一个确定的数。


num,name,sex是Student类的成员变数,而n,nam,s是构造函数的形参。构造函数传入不同的实参,得到的对象的num,name,sex就是不同的值。想让得到对象的num为0就在构造函数里传入0,想让得到对象的num为1就在构造函数里穿入1。如果在构造函数里写num = 0,那么调用这个构造函数得到的所有对象,它们的num都是0。


可能因为按代码行数发工资?万恶的资本家把属性在构造函数里赋值,这样就少写3行代码。少发3行工资,美滋滋


推荐阅读:
相关文章