应提供类不存在默认构造函数数吗

C++构造函数—构造函数的声明与定义、带参数的构造函数_C语言中文网
&&/&&&&/&&&&/&&
构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化。那么,构造函数到底是什么样子的呢?
构造函数的声明与定义
在C++中,规定与类同名的成员函数就是构造函数。需要注意的是,构造函数应该是一个公有的成员函数,并且构造函数没有返回值类型。以下是我们为链表结点类编写的一个构造函数:(其他成员函数定义见14.3节)
#include &iostream&//如果不包含iostream头文件,这个文件里就不能用cout
class Node//定义一个链表结点类
& &public:
& &Node();//构造函数的声明,构造函数是公有的成员函数,没有返回值类型
& &private:
& &//存储数据保密
& &//存储数据保密
& &Node *//前驱结点的存储位置保密
& &Node *//后继结点的存储位置保密
Node::Node()//构造函数的定义
& &cout &&&Node constructor is running...& &&//提示构造函数运行
& &idata=0;//初始化idata
& &cdata='0';//初始化cdata
& &prior=NULL;//初始化前驱结点指针
& &next=NULL;//初始化后续结点指针
这时,我们创建一个链表结点对象,构造函数随着对象创建而自动被调用,所以这个对象创建之后idata的值为0,cdata的值为'0',prior和next的值都是NULL:(程序15.2.1)
//main.cpp
#include &iostream&
#include &node.h&
int main()
& &N//创建一个链表结点对象a,调用构造函数
& &cout &&a.readi() &&
& &cout &&a.readc() &&
& &return 0;
运行结果:
Node constructor is running...
可是,这样的构造函数还是不太理想。如果每次初始化的值都是固定的,那么有没有构造函数都是一样的。构造函数变成了一种摆设!我们该怎么办?
带参数的构造函数
函数的特征之一就是能够在调用时带上参数。既然构造函数也是函数,那么我们就能给构造函数带上参数,使用重载或默认参数等方法,从而实现更自由地对对象进行初始化操作。以下便是对链表结点类的进一步修改:(程序15.2.2)
#include &iostream&
class Node//定义一个链表结点类
& &public:
& &Node();//构造函数0
& &Node(int i,char c='0');//构造函数重载1,参数c默认为'0'
& &Node(int i,char c,Node *p,Node *n);//构造函数重载2
& &int readi()//读取idata
& &char readc()//读取cdata
& &Node * readp()//读取上一个结点的位置
& &Node * readn()//读取下一个结点的位置
& &bool set(int i);//重载,通过该函数修改idata
& &bool set(char c);//重载,通过该函数修改cdata
& &bool setp(Node *p);//通过该函数设置前驱结点
& &bool setn(Node *n);//通过该函数设置后继结点
& &private:
& &//存储数据保密
& &//存储数据保密
& &Node *//前驱结点的存储位置保密
& &Node *//后继结点的存储位置保密
int Node::readi() const//成员函数readi的定义
char Node::readc() const
Node * Node::readp() const
Node * Node::readn() const
bool Node::set(int i)//重载成员函数定义
& &idata=i;
bool Node::set(char c)
& &cdata=c;
bool Node::setp(Node *p)
& &prior=p;
bool Node::setn(Node *n)
& &next=n;
Node::Node()//构造函数0的定义
& &cout &&&Node constructor is running...& &&//提示构造函数运行
& &idata=0;//初始化idata
& &cdata='0';//初始化cdata
& &prior=NULL;//初始化前驱结点指针
& &next=NULL;//初始化后续结点指针
Node::Node(int i,char c)//构造函数重载1,默认参数只需要在函数原型中出现
& &cout &&&Node constructor is running...& &&
& &idata=i;
& &cdata=c;
& &prior=NULL;
& &next=NULL;
Node::Node(int i,char c,Node *p,Node *n)//构造函数重载2
& &cout &&&Node constructor is running...& &&
& &idata=i;
& &cdata=c;
& &prior=p;
& &next=n;
//main.cpp
#include &iostream&
#include &node.h&
int main()
& &N//创建一个链表结点对象a,调用构造函数0
& &Node b(8);//创建一个链表结点对象b,调用构造函数重载1,参数c默认为'0'
& &Node c(8,'F',NULL,NULL);//创建一个链表结点对象c,调用构造函数重载2
& &cout &&a.readi() &&' ' &&a.readc() &&
& &cout &&b.readi() &&' ' &&b.readc() &&
& &cout &&c.readi() &&' ' &&c.readc() &&
& &return 0;
运行结果:
Node constructor is running...
Node constructor is running...
Node constructor is running...
我们看到,在参数和重载的帮助下,我们可以设计出适合各种场合的构造函数。初始化各个对象的成员数据对我们来说已经是小菜一碟了。但是,这时你是否会回想起当初没有编写构造函数时的情形?如果没有编写构造函数,对象的创建是一个怎样的过程呢?
在C++中,每个类都有且必须有构造函数。如果用户没有自行编写构造函数,则C++自动提供一个无参数的构造函数,称为默认构造函数。这个默认构造函数不做任何初始化工作。一旦用户编写了构造函数,则这个无参数的默认构造函数就消失了。如果用户还希望能有一个无参数的构造函数,必须自行编写。
推荐文章 TOP10三种情况必须在类构造函数初始化列表初始化(资料整理)
关于类的构造函数,可以分为两个部分,初始化部分(初始化列表)和计算部分(花括号间的赋值运算),在花括号作用域间进行的运算不是初始化,而是赋值。
对于必须在定义时初始化的情况在类构造函数中也是相同的
总结如下:
1、const成员:常量,不能被改变,定义的同时必须初始化
2、引用成员:&,别名,与目标共享地址,定义的同时必须初始化
3、没有默认构造函数供系统自动调用:
(1)对象成员:A类的成员是B类的对象,在构造A类时需对B类的对象进行构造,当B类没有默认构造函数时需要在A类的构造函数初始化列表中对B类对象初始化
(2)类的继承:派生类在构造函数中要对自身成员初始化,也要对继承过来的基类成员进行初始化,当基类没有默认构造函数的时候,通过在派生类的构造函数初始化列表中调用基类的构造函数实现
下面是1、2验证程序
//const成员的初始化只能在构造函数的初始化列表中进行
//引用成员的初始化也只能在构造函数的初始化列表中进行
class object
&object(int num = 0 ,int knum =
0):num_(num),knum_(knum),refnum_(num)
&&//num_ =
//可在初始化列表中赋值也可以在此处计算段赋值
&&//knum_ =
&&&&&//Error:常量是不能被修改的,必须在初始化列表中赋初值
&&//refnum_ =
&&&&//Error:引用要先在初始化列表中初始化
&&cout&&"object..."&&num_&&knum_&&refnum_&&
&int num_;
&const int
&&//成员变量是一个常量,未初始化
refnum_;&&&&&&&&&
//成员变量是一个引用,未初始化
int main(void)
&object obj_(10,10);
&return 0;
下面是3验证程序
class Base
&Base(int b):b_(b)
class Derived : public Base
&//Derived()&&&&&//Error:派生类构造对象时需要先对基类的成员初始化,系统自动调用基类默认构造函数
&Derived(int b, int d):Base(b),
&~Derived()
int main(void)
&return 0;
来自对学习资料的整理,欢迎指正!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2016年1月 总版技术专家分月排行榜第二2015年11月 总版技术专家分月排行榜第二2015年10月 总版技术专家分月排行榜第二
优秀小版主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。求解“没有合适的默认构造函数可用”,但是我已经有构造函数了_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:281,503贴子:
求解“没有合适的默认构造函数可用”,但是我已经有构造函数了收藏
#include&iostream&#include&string&class Preson{protected:public:Preson(string n, char s, int a);Preson(Preson &a);void Display();void set(string n, char s, int a);void copy(Preson &a);};Preson::Preson(string n, char s, int a){ name = sex = age = }Preson::Preson(Preson &a){ Preson &b = };void Preson::Display(){cout && &姓名:& && name && endl && &性别:& && sex && endl && &年龄:& && age && endl &&}void Preson::set(string n, char s, int a){name =sex =age =cout && &姓名:& && name && endl && &性别:& && sex && endl && &年龄:& && age && endl &&}void Preson::copy(Preson &a){string n =char s =int ag =cout && &姓名:& && n && endl && &性别:& && s && endl && &年龄:& && ag && endl &&}class Student : public Preson{protected://C++成绩//考勤次数(最大值10)public:Student(string n, char s, int a, float cp, int co) :Preson(n, s, a){cpp =count =}float socre();void Display();void copy(Student &a);};float Student::socre(){if (count&5) return(cpp*0.9 + count);if (count &= 5) return(cpp*0.9);}void Student::Display(){cout && &姓名:& && name && endl && &性别:& && sex && endl && &年龄:& && age && endl&& &成绩:& && cpp && endl && &考勤次数:& && count && endl && &综合成绩:&;if (count&5) cout && (0.9*cpp + count) && endl &&if (count &= 5) cout && (0.9*cpp) && endl &&}void Student::copy(Student &a){string n =char s =int ag =float c =int co =cout && &姓名:& && n && endl && &性别:& && s && endl && &年龄:& && ag && endl && &成绩:& && c && endl && &考勤次数:& && co && endl &&}class Teacher :public Preson, public Student{protected:Student st[100];public:Teacher(string s, char c, int a, int n);void Add(Student & a);void Display();};Teacher::Teacher(string s, char c, int a, int n) :Preson(s, c, a){
//就是这里出错了,提示类“Student”不存在默认构造函数num =}
马尔代夫、泰国、中国、马来西亚多国酒店全部订一晚送一晚,3天限时优惠
代码比较长,但是很多部分是可以不看的…我明明已经在Student中谢了构造函数,为啥还会说“没有合适的默认构造函数”
原题:(1) 完成人员类 Person:数据成员(protected):姓名
年龄函数成员(public):构造函数
Person(string n, char s, int a);(提示:形参分别表示:姓名,性别,年龄,三个形参均带缺省值)拷贝构造函数 Person(Person&a); 显示信息
void Display();
(提示:显示人员信息,输出占一行,次序分别是: 姓名
年龄 。)设置信息
void set(string n,char s,int a); (提示:形参分别表示:姓名,性别,年龄,三个形参均带缺省值。)复制人员信息
void copy(Person &a);(提示:函数体与拷贝构造函数的类似,但要注意该函数与拷贝构造的区别。)完成类的定义,并编写主函数对其进行测试,要求每个成员函数均要测试到。(2) 在Person类的基础上派生出学生类 Student:数据成员(protected):c++期末成绩:
c++考勤次数:
// 最大值10函数成员(public):
(提示: 自已定义其形式,注意基类的构造参数
) c++综合成绩
float score(); (提示:返回综合成绩,综合成绩评定标准:= cpp*0.9+考勤次数
考勤次数&5
考勤次数&=5显示信息
void Display(); (提示: 显示学生信息,输出次序: 姓名
年龄 cpp成绩
综合成绩 )复制信息
void copy(Student & a); (提示:将学生a的信息复制到this对象上 )完成类的定义,并编写主函数对其进行测试,要求每个成员函数均要测试到。(3)在Person类的基础上派生出教师类 Teacher:数据成员(protected):
// 学生数组
// 学生数函数成员(public):
自己定义 增加学生:
void Add(Student & a);//增加学生信息显示信息
void Display(); (提示:输出所有学生信息,每个学生信息一行,格式同Student类的输出函数。)完成类的定义,并编写主函数对其进行测试,要求每个成员函数均要测试到
求解,在下感激不尽
添加一个不带参数的构造函数
继承与派生 目测楼主接下来要学重载了吧
楼上都解决了,我吐槽一下preson是什么鬼
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 默认拷贝构造函数 的文章

 

随机推荐