c++构造函数总结

c++构造函数总结

构造函数是类中,特殊的成员函数,用于初始化数据成员,其定义的语法如下:

class 类名{
    public:
         构造函数名称(参数表)
        {
            函数体
    
        }
    private:
        数据成员;


};

构造函数定义的语法规定为:

构造函数名与类名相同;

构造函数名前没有返回值类型声明。

构造函数中不能通过return语句返回一个值。

通常构造函数具有public属性。

1、系统提供的默认构造函数

#include<iostream>
using namespace  std;
class car{
	//成员函数
	public:
		void Disp_val(); 
	private:
		int lunzi;
		int zuowei;
		int length;
}; 
void car::Disp_val()
{
	cout << "luozi    " << lunzi << endl;
	cout << "zuowei   " << zuowei << endl;
	cout << "length   " << length << endl;
}
int main(){
	car mycar;
	mycar.Disp_val();
	system("pause");	
	return 0; 
}

 运行结果为:

c++构造函数总结

2,自定义无参构造函数:

#include<iostream>
using namespace std;

class Car{
    public:
    Car(){
        cout << "car constucf!" <<endl; 
        m_strcarname = "xucheng";
    }
    string getname(){
        return m_strcarname;
    }
    private:
        string m_strcarname;
};
int main(){
    Car mycar;
    cout << "car naem!" << mycar.getname()<<endl;
    system("pause");
    return 0;
}

 运行结果为:

c++构造函数总结

3,自定义带参数的构造

通常我们希望能在对象创建时为数据成员提供有效值。同时定义多个构造函数就可以实现构造函数的重载

例子:

#include<iostream>
using namespace std;
class Car{
	public:
		Car(string con_carname, int con_seats){
			cout << "Calling Car constructor, set carname , seat!" << endl;
			m_strCarname  =  con_carname;
			m_seats = con_seats;
		}
		Car(string con_carname){
			cout << "please cin your carname" << endl;
			m_strCarname = con_carname;
		}
		void disp();
	private:
		string m_strCarname;
		int m_seats;
};
void Car::disp(){
	cout << "carname   " << m_strCarname <<","
		<< "  Seats = "<<m_seats<<endl;  
}
int main(){
	Car mycar("my car is lanbojini", 8);
	Car yourcar("nihao");
	mycar.disp();
	yourcar.disp();
	system("pause");
	
	return 0;
}

对于带参数的构造函数,除了上面介绍的外还可以,通过下面两种方式对数据进行赋值

1,通过初始化表,来实现数据成员的初始化

2,默认参数值的构造函数

上例子吧,看看格式,懒得打

#include<iostream>
using namespace std;

class Car{
	public:
		//通过初始化表对数据成员进行初始化
		Car(string con_carname,int con_seats) : m_carname(con_carname),m_seats(con_seats){
			cout<<"calling Car constructor , set  carname and seats!"<<endl;	
		}
		//定义带有默认参数值的构造参数 
		Car(string con_carname = "我的新车"){
			cout <<"calling Car constructor , set  carname and seats!" <<endl;	
			m_carname = con_carname;
			m_seats = 4;
			
		}
		void dispxianshi(){
			cout << "汽车的名字为: "<<m_carname<<";"
			<<"汽车的座位是: " << m_seats << endl;
		} 
	private:
		string m_carname;
		int m_seats;
};
int main(){
	Car mycar;
	Car youcar("兰博基尼",4);
	mycar.dispxianshi();
	youcar.dispxianshi();
	system("pause");
	return 0;
}

运行结果为:
c++构造函数总结

 对于带默认的参数值的构造函数的定义及使用有两个注意事项:

1,对于带默认参数值的构造函数来说,需要防止调用的二义性。

2,构造函数中若第n个参数有默认值,则其后的所有参数,都应该有默认值,若构造函数定义为如下内容,则编译出错

car(string con_carname = “my car “, int con_seats );

脚下留心!:

类中定义构造函数后,编译器不再提供默认构造函数,(java中也一样)

还有一个小知识点,就是包含对象成员的类的构造函数;

这个理解起来不难,下面见一个例子吧

#include<iostream>
#include<string>
using namespace std;

class Student
{
public:
    string name;
    string number;
    char X;
    int year;
    Student(string,string,char,int);      //构造函数声明
    void xianshi(void);     //用于输出类成员的值
};

//成员函数定义,包括构造函数
Student::Student(string N,string n,char x,int y)    //利用构造函数给类的成员赋值
{
    name = N;
    number = n;
    X = x;
    year = y;
}

void Student::xianshi()     //输出成员的值
{
    cout<<name<<endl;
    cout<<number<<endl;
    cout<<X<<endl;
    cout<<year<<endl;
}

int main()                             //主函数
{
    cout<<"输入姓名:";
    string N;
    cin>>N;
    cout<<"输入学号:";
    string n;
    cin>>n;
    cout<<"输入性别(M 或 W):";
    char x;
    cin>>x;
    cout<<"输入年龄:";
    int y;
    cin>>y;
    Student S(N,n,x,y);               //定义对象并对构造函数赋值
    S.xianshi();                           //引用输出函数
    return 0;
}

 运行结果为:

c++构造函数总结

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114817.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • git 回滚到指定版本_git回滚多了怎么办

    git 回滚到指定版本_git回滚多了怎么办我们在GIT操作项目时,往往会遇到很多需要回滚的代码。我们可以回滚到任意之前的版本,case如下:1.首先找到你需要回滚的版本号,可以通过日志查看命令行:gitlog-32.选择上图红色箭头执行的commit版本号,第一个时最后提交的,我们回滚到第二个commit:f3eb8f9df34dc6ba47e477e05c8772a62d653fbb命令行:gitr

    2022年10月25日
  • 学习双拼必看(最全教程):双拼输入法的心得以及快速入门办法

    学习双拼必看(最全教程):双拼输入法的心得以及快速入门办法1.简单介绍一下双拼2.总共18种双拼方案3.15种双拼方案的具体映射4.顺便提一下双拼口诀的事情5.总结不同平台选择的方案双拼(也称双打)是一种建立在拼音输入法基础上的输入方法,可视为全拼的一种改进,它通过将汉语拼音中每个含多个字母的声母或韵母各自映射到某个按键上,使得每个音都可以用两个按键打出,极大地提高了拼音输入法的输入速度。这种声母或韵母到按键的对应表通常称之为双…

  • goland 激活码2021【2021最新】

    (goland 激活码2021)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html9K2BT69C4S-eyJsaWNlbnNlSWQi…

  • rammap使用_查看内存的命令

    rammap使用_查看内存的命令参考TechnetProcessPrivate:分配给单一Process专用的内存MappedFile:用来储放档案内容快取(Cache)的内存空间SharedMemory:标注给多个Process共用的内存分页(Page,内存管理单位)PageTable:用来描述虚拟内存位址的分页表(裡面是一笔一笔的PTE,PageTableEntries)PagedPool…

    2022年10月23日
  • marquee用到的属性

    marquee用到的属性一、marquee标签的几个重要属性:1.direction:滚动方向(包括4个值:up、down、left、right)说明:up:从下向上滚动;down:从上向下滚动;left:从右向左滚动;

  • 2021 goland激活码[在线序列号]

    2021 goland激活码[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号