C++无参构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++无参构造函数相关的知识,希望对你有一定的参考价值。

#include<iostream.h>
#include<string.h>
class student
int age;char name[10];char num[8];
public:
student()age=0; *name="noname"; *num="0000";
set(int n,char *pn,char *pnum);
void print()
cout<<"age:"<<endl;
cout<<"name:"<<endl;
cout<<"num:"<<endl;
;
student::set(int n,char *pn,char *pnum)
age=n;
strcpy(name,pn);
strcpy(num,pnum);

main()
student a[2];
a[0].set(18,"chen","0123");
a[1].set(19,"cai","0124");
a[0].print();
a[1].print();

这是我写的垃圾代码,我想问的是我一运行这个为什么会出现如下错误呢?
注意我问是为什么啊!我的错误在于无参构造函数那应该改为student()int age=0;char *name="noname";char *num="0000";

D:\Program Files\Microsoft Visual Studio\MyProjects\student\student.cpp(6) : error C2440: '=' : cannot convert from 'char [7]' to 'char'
This conversion requires a reinterpret_cast, a C-style cast or function-style
谢谢啦

char name[10];char num[8];
这是你的定义语句,很明显name,num都是字符数组名称。

再来看这段代码:
student()age=0; *name="noname"; *num="0000";
*name代表name[0](因为name即字符数组的首地址,那么*name就是指字符数组第一个元素的值),*num同理。
所以用一个字符串(noname)对单个字符变量(name[0])赋值,编译就会检测出错.误。即cannot convert from 'char [7]' to 'char' (不能将字符数组转化为字符数组的一个元素)。

希望可以帮到你~
参考技术A 你的代码已经非常好了。

你可以将char 修改成 std::string 就没有任何问题了。
如下

class student
int age;std::strin name;std::string num;

既然C++提供了给你字符串,你就要懂得利用资源
参考技术B 原因是这样的:

首先明确几个问题
1.数组的名字是个地址(指针)指向数组第一元素.
2.用双引号括起来的字符串也是一个地址!
3.用*运算符对一个指针操作,是引用这个指针指向的变量.
4.char * p; 变量声明中的*不是运算符,它是个标志与 3 中不同。

你的错误:
1.student()age=0; *name="noname"; *num="0000";
*name就是引用了name数组的第一个char类型变量,你把一个指针赋值给char当然不对!!

2.为什么改完就对了呢?因为char *name="noname";char *num="0000"中,你定义了两个char指针型局部变量:name、num。这两个变量和前面的两个数组没关系!!之所以同名不报错是因为优先级的原因,但是你这个构造函数是一点作用都没起到!!
参考技术C 当然不行,你可以把数组变量名看成一个const指针,="xxxx"这种符值的方法其实就是把"xxxx"的地址符给变量,更何况*name和*num实际是指向了数组里的第一个元素,除非你每个元素也是个指针,否则这样的符值肯定是错误的 参考技术D 使用
strcpy(name, "noname");
strcpy(num, "0000");

以上是关于C++无参构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C++:初始化成员变量(无参构造|有参构造|初始化列表)

构造函数调用

C++构造和析构

C++类-带参数的构造函数

C++类-带参数的构造函数

C++ 类的复制控制