构造函数声明和定义的区别可以在类内声明类外定义吗

构造函数在类外定义-学网-提供健康,养生,留学,移民,创业,汽车等信息
构造函数在类外定义
析构函数就是把构造函数释放掉。CCarB(int weight, int b) : CCar(weight); CCar(weight); 相当于初始化继承于父类的变量,加上这个,必须写上函数体。因为这样,就不是声明了。可以在类外定义啊举例:9303132#include&&stdio.h& &class&Student&{&private:&... int a,b; //放在public里 A(int param1, int param2); } 或者: class A() { int a,b; public: A(int param1, int param2); int GetA(){}; int GetB(){}; } 然后在调用...写法正确,看看是不是其他问题 另外模板类的成员函数 一般没必要写外面来,因为写外面也不能.h .cpp分开定义写在.h头文件中,实现和用到的时候#include它,不然等于没定义if(name!=NULL) { strcpy(name,na); } }//基类的构造函数 protected: int n... n,char *na): Employee(n,na) { monthsalary=8500; } 这是在类外用参数列表实现stu::stu()//无参构造函数 {} stu::~stu()//析构函数 { cout&&&delete&&& } 没有在类中声明 在class stu定义中加上就可以了不一定,要看编译器如何解读这段代码。但一般来说都是内联函数。是不是 另一个Cpp文件没有包含定义类Res的文件 啊
您可能还关注:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
大类导航: |君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
用户在声明类时可以不定义构造函数,未定义构造函数,未定义隐式超构造函数,构造函数定义,构造函数的定义,c 未定义构造函数,c 构造函数定义,自定义view 构造函数,java中构造函数定义,构造函数定义在类外
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
用户在声明类时可以不定义构造函数
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口&&/&&&&/&&&&/&&
构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化。那么,构造函数到底是什么样子的呢?
构造函数的声明与定义
在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关于构造函数的类外定义的小小问题_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:279,101贴子:
关于构造函数的类外定义的小小问题收藏
我在第一个Cpp文件里有一个类Res,里面有4个构造函数Res(),然后我在另一个Cpp文件里定义这四个构造函数,我仿照以前的格式,Res::Res(),括号里的参数我省略不打了,然而它却报错,说::前一定是个类或命名空间的名称,这是为什么,我应该怎么写
c++海同强大的师资阵容,因人制定课程内容,分阶段学习.c++就到正规IT技术培训机构-海同科技,培训IT技术面对面教学,免费重读!
求不沉,自己顶一下
#include &iostream&#include &stdio.h&#include &string.h&class Res{private:// 私有权限,可缺省int node1, node2,char *public:// 公有权限void setName(char *str)// 构造函数{name = new char[strlen(str)];strcpy(name, str);}void setNode(int n1, int n2)// 成员函数{node1 = n1;node2 = n2;}void setValue(int v, char u)// 成员函数{if(u == 'O')value =if(u == 'K')value = v * 1000;}int getValue()// 成员函数{return(value);}char *getName()// 成员函数{return(name);}void prtR()// 成员函数{cout && value && & Ohm @ &&& node1 && &, & && node2 &&}Res()// 缺省构造函数{node1 = 0;node2 = 0;value = 0;name = NULL;}// 以下各个构造函数在类内说明,请在&exe4-16电阻类函数.cpp&中完成类外定义Res(int n1, int n2);// 构造函数Res(char *str);// 构造函数Res(int v, char u);// 构造函数Res(const Res &r);// 拷贝构造函数// 以下成员函数在类内说明,请在&exe4-16电阻类函数.cpp&中完成类外定义void prtRes(void);// 成员函数};#include &exe4-16电阻类函数.cpp&void main(){int node1, node2, node3, node4;cout && &input node1 and node2 for Res1: &;cin && node3 && node4;cout && &input node1 and node2 for Res2: &;cin && node1 && node2;cout &&Res r1(15, 'K');// 调用构造函数初始化r1r1.prtR();Res r2(node1, node2);// 调用构造函数初始化r2r2.prtR();Res r3;// 调用缺省构造函数初始化r3r3.prtR();r1.setName(&1&);r1.setNode(node3, node4);r1.prtRes();r2.setName(&2&);r2.setValue(800, 'O');r2.prtRes();r3.setName(&3&);r3.prtRes();Res r4 = r1;// 调用拷贝构造函数对r4赋值r4.setName(&4&);r4.prtRes();Res r5 = r2;// 调用拷贝构造函数对r5赋值r5.setName(&5&);r5.setValue(150, 'O');r5.prtRes();r3 = r2;// 调用隐式拷贝构造函数对r4赋值r3.setName(&3&);r3.setValue(2100, 'O');r3.prtRes();getchar();}/*2 34 1input node1 and node2 for Res1: 2 3input node1 and node2 for Res2: 4 115000 Ohm @ - -- Ohm @ 4 10 Ohm @ 0 0R1 = 15000 Ohm @ 2 3R2 = 800 Ohm @ 4 1R3 = 0 Ohm @ 0 0R4 = 15000 Ohm @ 3 2R5 = 150 Ohm @ 1 4R3 = 2100 Ohm @ 4 1*/
// 以下各个构造函数在&exe4-16电阻类程序.cpp&中完成类内说明//Res(int, int);// 构造函数//Res(char *);// 构造函数//Res(int, char);// 构造函数//Res(const Res &);// 拷贝构造函数// --------- 请补齐各个构造函数的类外定义 ---------------// 以下成员函数在&exe4-16电阻类程序.cpp&中完成类内说明//void prtRes(void);// 成员函数// --------- 请补齐成员函数prtRes的类外定义 -------------
忘了include了吧——可有少女愿意为你踮起脚跟
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 c语言函数声明和定义 的文章

 

随机推荐