【C++】构造函数

引入:

有这样一个学生类

cpp 复制代码
class Student {
public:
	int classN;
	int age;
	bool sex;
	const char* name;
	void introduceMyself() {
		std::cout << "Hello,everyone!My name is " << name << std::endl;
	}
};

我们创建一个对象,并调用introduceMyself()方法,会报错

cpp 复制代码
int main() {
	Student stu;
	stu.introduceMyself();
}

因为name没有被初始化,需要被赋值

在Java中数据基本类型如int和float会自动初始化为0

但在C++中你必须手动初始化所有基本类型

那我们定义一个初始化名字的方法。并在创建对象后首先调用它

cpp 复制代码
#include<iostream>
class Student {
public:
	int classN;
	int age;
	bool sex;
	const char* name;
	void Init() {
		name = "未命名";
	}
	void introduceMyself() {
		std::cout << "Hello,everyone!My name is " << name << std::endl;
	}
};
int main() {
	Student stu;
	stu.Init();
	stu.introduceMyself();
}

这样写很麻烦,当我们构造对象时,如果有办法直接运行这个初始化代码就好了

构造函数来拯救你啦

cpp 复制代码
#include<iostream>
class Student {
public:
	int classN;
	int age;
	bool sex;
	const char* name;
	Student() {//这就是构造函数
		name = "未命名";
	}
	void introduceMyself() {
		std::cout << "Hello,everyone!My name is " << name << std::endl;
	}
};
int main() {
	Student stu;
	stu.introduceMyself();
}

构造函数用来在创建对象时初始化对象,即为对象的成员变量赋初始值

  • 构造函数名和类名相同
  • 构造函数没有返回值类型和返回值
  • 构造函数可以重载,需要满足函数重载的条件

构造函数的调用时机:

  1. 栈区对象的产生
  2. 堆区对象的产生

++构造函数在类实例化对象时会自动调用++

既然可以重载,那就说明还有带参的构造函数

示例:

cpp 复制代码
#include<iostream>
class Student {
public:
	Student(){}//无参构造
	Student(int a){}//有参构造
};
int main() {
	Student stu1;//定义一个类对象,默认调用无参构造
	Student stu2 = { 18 };//隐式调用有参构造
	Student stu3(20);//显式调用有参构造
	Student* StuP = new Student;//堆区对象也会自动调用构造函数
}
  • 如果一个类中没有显式地给出构造函数,系统会自动地给出一个缺省的(隐式)构造函数
  • 如果用户提供了无参(有参)构造,那么系统就不再提供默认构造
  • 如果类中只有有参构造,没有无参构造,那么就不能调用默认构造的方式初始化对象,想用这种方式初始化对象,就要提供无参构造

假设你有一个Log类,它只有静态的write()方法

cpp 复制代码
class Log{
public:
	static void write(){}
};

你只想以这种方式使用Log类:Log::write();

不希望可以创建实例:Log l;

有两种解决方法

1.设置为private来隐藏构造函数

cpp 复制代码
class Log{
private:
	Log(){}
public:
	static void write(){}
};
cpp 复制代码
class Log{
public:
	Log() = delete;
	static void write(){}
};
相关推荐
ShineWinsu15 小时前
对于C++:继承的解析—上
开发语言·数据结构·c++·算法·面试·笔试·继承
小付同学呀16 小时前
C语言学习(五)——输入/输出
c语言·开发语言·学习
梦幻精灵_cq16 小时前
学C之路:不可或缺的main()主函数框架(Learn-C 1st)
c语言·开发语言
消失的旧时光-194316 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
福大大架构师每日一题17 小时前
go-zero v1.10.0发布!全面支持Go 1.23、MCP SDK迁移、性能与稳定性双提升
开发语言·后端·golang
抓饼先生18 小时前
iceoryx编译和验证
linux·c++·零拷贝·iceoryx
王老师青少年编程18 小时前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
五阿哥永琪18 小时前
1. 为什么java不能用is开头来做布尔值的参数名,会出现反序列化异常。
java·开发语言
逻极18 小时前
pytest 入门指南:Python 测试框架从零到一(2025 实战版)
开发语言·python·pytest
你的冰西瓜19 小时前
C++ STL算法——排序和相关操作
开发语言·c++·算法·stl