C++随笔之类的构造函数

1. C++构造函数的作用

        ~ 创建类的对象

        ~ 如果是普通构造函数,初始化类对象下所有成员数据

        ~ 如果是拷贝构造函数,将已有的类对象下的所有成员数据复制一份,给新对象下的所有成员一一对应赋值

2. C++构造函数的特点

        ~ 不用函数那样前面必须加void类型或返回值的数据类型

        ~ 构造函数的名称必须和类型名称保持一致

        ~ 构造函数可以支持重载

3. C++构造函数的分类

        ~ 普通构造函数

                ● 无参构造函数
                ● 有参构造函数

        ~ 拷贝构造函数

4. C++构造函数实现和调用代码示例

#include<iostream>
#include<string>

using namespace std;

class User
{
private:
	string _name;
	int _age;
public:
	/*
	* 无参构造函数
	*/
	User()
	{
		_name = "";
		_age = 0;
	}
	/*
	* 有参数的构造函数(也是重载的构造函数)
	*/
	User(string name)
	{
		_name = name;
		//默认永远18
		_age = 18;
	}
	User(string name, int age)
	{
		_name = name;
		_age = age;
	}
	/*
	* 拷贝构造函数
	*	注意: 
	*		拷贝构造函数的参数声明格式必须是 const + 引用(引用的类型必须和当前类的类型保持一致) + 变量名称
	*		只有格式严格按照上述所写才叫做拷贝构造函数
	*/
	User(const User& other)
	{
		this->_name = other._name;
		this->_age = other._age;
	}
	string getName()
	{
		return _name;
	}
	void setName(string name)
	{
		_name = name;
	}
	int getAge()
	{
		return _age;
	}
	void setAge(int age)
	{
		_age = age;
	}
	string toString()
	{
		return "Name: " + _name + ", Age: " + to_string(_age);
	}
};

int main()
{
	/*
	* 构造函数的调用方式
	*/

	/*
	* 1. 括号法
	*	注意:
	*		调用无参构造函数时, 不要在变量后面加括号, 会被编译器误认为是函数的声明
	*/
	// 调用无参构造函数
	User u;
	u.setName("Sam");
	u.setAge(21);
	cout << "对象u: " << u.toString() << endl;
	// 调用有参构造函数
	User u2("Daming", 20);
	cout << "对象u2: " << u2.toString() << endl;
	// 调用拷贝构造函数
	User u3(u);
	cout << "对象3: " << u3.toString() << endl;

	/*
	* 2. 显示法
	*/
	// 调用无参构造函数
	User user = User();
	user.setName("Lili");
	user.setAge(23);
	cout << "对象user: " << user.toString() << endl;
	// 调用有参构造函数
	User user2 = User("Lucy", 20);
	cout << "对象user2: " << user2.toString() << endl;
	// 调用拷贝构造函数
	User user3 = User(user);
	cout << "对象user3: " << user3.toString() << endl;

	/*
	* 3. 隐式法
	*	注意: 只有参数个数是一个的时候才可以这么使用
	*/
	// 调用有参构造函数
	User u_1 = string("Tom");
	cout << "对象u_1: " << u_1.toString() << endl;
	// 调用拷贝构造函数
	User u_2 = u_1;
	cout << "对象u_2: " << u_2.toString() << endl;

	/*
	* 如果想要将类对象存储于内存堆中, 使用new关键字与显示法的调用方式结合使用
	*/
	User* user_p = new User("镇元斋", 80);
	cout << "存储于内存堆中的对象user_p: " << user_p->toString() << endl;
	//释放堆中对象
	delete user_p;

	return 0;
}

5. C++编译器默认提供构造函数的特点

        ~ 如果类中没有写任何构造函数,那么编译器会默认提供一个无参构造函数和一个拷贝构造函数

#include<iostream>
#include<string>

using namespace std;

class User
{
public:
    string name;
    int age;
    string toString()
    {
        return "Name: " + name + ", Age: " + to_string(age);
    }
};

int main()
{
    /*
    * 在类中没有写任何构造函数的情况下,依旧可以调用默认的无参构造函数
    */
    User u = User();
    u.name = "Sam";
    u.age = 20;
    cout << "对象u的信息: " << u.toString() << endl;

    /*
    * 在类中没有写任何构造函数的情况下,依旧可以调用拷贝构造函数
    */
    User u2 = User(u);
    cout << "对象u2的信息: " << u.toString() << endl;

    return 0;
}

        ~ 如果类中只写了无参构造函数或有参构造函数,编译器不会再提供默认的无参构造函数,但是依旧会提供默认的拷贝构造函数

#include<iostream>
#include<string>

using namespace std;

class User
{
public:
    string name;
    int age;
    User(string name, int age)
    {
        this->name = name;
        this->age = age;
    }
    string toString()
    {
        return "Name: " + name + ", Age: " + to_string(age);
    }
};

int main()
{
    /*
    * 编译性错误,因为已经提供了一个有参构造函数,所以编译器不会再提供一个默认的无参构造函数
    */
    User u = User();
    u.name = "Sam";
    u.age = 20;
    cout << "对象u的信息: " << u.toString() << endl;

    /*
    * 在类中没有声明拷贝构造函数的情况下,依旧可以调用拷贝构造函数
    */
    User u2 = User(u);
    cout << "对象u2的信息: " << u.toString() << endl;

    return 0;
}

        ~ 如果类中只写了拷贝构造函数,编译器就不会再提供默认的无参构造函数和默认的拷贝构造函数

#include<iostream>
#include<string>

using namespace std;

class User
{
public:
    string name;
    int age;
    /*
    * 拷贝构造函数
    */
    User(const User& other)
    {
        this->name = other.name;
        this->age = other.age;
    }
    string toString()
    {
        return "Name: " + name + ", Age: " + to_string(age);
    }
};

int main()
{
    /*
    * 编译性错误,因为User类中已经设置了拷贝构造函数,编译器无法再提供默认的无参构造函数
    */
    User u = User();

    return 0;
}

结尾

        如果您觉得我还写的不错,请给我一点点的鼓励,您的鼓励就是我坚持的动力,当然啦,一切要量力而行,不要勉强哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹏云友

您的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值