C++含有成员对象的类的构造函数问题

例题如下:
#include<iostream>
#include<cstring>
using namespace std;

class studentID{
long value;
public:
studentID(long id=0){
value=id;
cout<<"赋给学生的学号:"<<value<<endl;
}
~studentID(){
cout<<"删除学号:"<<value<<endl;
}
};

class student{
private:
studentID id;
char name[20];
public:
student::student (char sname[]=“no name”,long sid=0 ):id(sid){
cout<<"学生名:"<<sname<<endl;
strcpy(name,sname);
}

~student(){
cout<<"删除学生名:"<<name<<endl;
}
};

int main(){
student ss;
return 0;
}

问题一:为什么在student类中的构造函数student (char sname[]=“no name”,long sid=0 )是这样初始化的sname[]的?为什么不能是char sname[0]="" ?是有什么意义吗?
问题二:为什么调试程序时发现程序走到student::student (char sname[]=“no name”,long sid=0 ):id(sid){ 这一行后跳到了class studentID类中的构造函数上?这个运行原理是啥?我有点不明白。。
求大神帮忙,小弟十分感激!
一:我用char sname[0]="" 为什么也能编译成功?sname[0]应该只能表示单个字符啊。

二:可能我没说清楚,我知道这俩都是默认的构造函数。但是为什么student::student (char sname[]=“no name”,long sid=0 ):id(sid){ 跳过去,它是因为这一行的哪个符号跳过去的?
我觉得可能和studentID id;有关,对于class student 来说,studentID id应该是属于其他类的一个对象吧?能详细讲一下吗

答1:
char sname[] 在作为函数参数是表示指针,等同于char *sname。
(因为用[]一眼能看出指针指向数组。sname[0]表示的是单个字符)

student (char sname[]=“no name”,long sid=0 ) //这叫默认参数,即如果调用该函数,如果在调用 //的时候没有给实参,则会默认给sname赋值“no //name”,sid赋值0

答2:
构造函数是在定义类对象的是后自动调用的(初始化类对象)。
你在main中定义了一个类对象,会自动调用,如果你没有在类声明中定义构造函数,则会默认帮你生成一个。(默认生成的里面什么都没有操作,但还是会被调用)追问

一:我用char sname[0]="" 为什么也能编译成功?sname[0]应该只能表示单个字符啊。二:可能我没说清楚,我知道这俩都是默认的构造函数。但是为什么student::student (char sname[]=“no name”,long sid=0 ):id(sid){ 跳过去,它是因为这一行的哪个符号跳过去的?

追答

答1:
额~~忘了~~
作为函数的参数char s[]; //[]当中无论填写多少数字都无法起作用的,参数只是起到说明类型的作用

所以你的 char sname[0] 就相当于char sname[],也就是char *sname;

答二:

是因为class student类中的studentID id;//创建了studentID 类对象,所以调用studentID 的构造函数

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-02-03
1 第一个问题是给构造成员变量加初始值,为了使得程序友好

2 第二个问题 因为在你初始化的时候 ,先调用初始化列表里面的成员进行初始化,就会调用该对象所属的该类的构造函数
第2个回答  2021-03-12

相似回答