下面先总结一下构造函数的相关知识:
- 成员变量都是在构造函数内被创建并且分配内存的。
- 成员变量需要在构造函数中初始化。
- 当不写构造函数时,编译器会添加一个默认构造函数,默认构造函数是无参数的构造函数。
- 当类中只要有一个构造函数时,编译器就不会添加默认构造函数。
构造函数
类point_t
的构造函数的声明如下:
point_t(void);
构造函数是一个特殊的成员函数。从上面的代码可以看出,构造函数的函数名称就是类名,并且没有返回值,而它的参数跟普通的函数一样根据需要而定。构造函数的一般用于初始化成员变量和初始化一些操作。
类point_t
的构造函数的定义格式如下:
point_t::point_t(void)
{
}
初始化列表
成员变量的初始化是写在构造函数里面,先看看完整的例子:
基础示例
#include <iostream> // std::cout std::endl
class point_t
{
public:
point_t(int a, int b);
public:
int x;
int y;
};
int main(void)
{
point_t point(555, 666);
std::cout << "横坐标的值是:" << point.x << std::endl;
std::cout << "纵坐标的值是:" << point.y << std::endl;
return 0;
}
point_t::point_t(int a, int b)
: x(a)
, y(b)
{
}
输出结果:
横坐标的值是:555
纵坐标的值是:666
基础讲解
初始化是写在构造函数的参数和{
之间,初始化列表以冒号:
开始,后面每个变量之间用逗号,
分隔,而成员变量初始化用括号()
而不是赋值符号=
。
然后调用时要这样写:point_t point(555, 666);
,这样就会调用point_t
的构造函数。
重载构造函数
上面代码中,当我们使用point_t point;
这样定义对象时,编译就会报错。因为上面提到过的:当类中只要有一个构造函数时,编译器就不会添加默认构造函数。这个时候就必须再写一个无参数的构造函数了。
基础示例
#include <iostream> // std::cout std::endl
class point_t
{
public:
point_t(void);
point_t(int a, int b);
public:
int x;
int y;
};
int main(void)
{
point_t point1(555, 666);
std::cout << "point1横坐标的值是:" << point1.x << std::endl;
std::cout << "point1纵坐标的值是:" << point1.y << std::endl;
point_t point2;
std::cout << "point2横坐标的值是:" << point2.x << std::endl;
std::cout << "point2纵坐标的值是:" << point2.y << std::endl;
return 0;
}
point_t::point_t(void)
: x(0)
, y(0)
{
}
point_t::point_t(int a, int b)
: x(a)
, y(b)
{
}
输出结果:
point1横坐标的值是:555
point1纵坐标的值是:666
point2横坐标的值是:0
point2纵坐标的值是:0
基础讲解
只要加上无参数的构造函数,那么就可以像上面代码那样,使用point_t point2;
来声明对象了。
现在我们就知道,像智能指针和字符串这些类在创建对象的时候不需要初始化,它们会在构造函数里面把需要初始化的成员变量的都初始化了。
最后的注意
再说一个构造函数需要注意的问题。当我们调用有多个参数的构造函数时是需要加上()
:
point_t point(555, 666);
但是我们调用无参数的构造函数时,是不能加上()
的,如:point_t point();
这种写法是不能创建对象的。
看了以下例子你就会知道原因了:
#include <iostream>
#include <string>
int main(void)
{
std::string create_string();
return 0;
}
std::string create_string()
{
return "你好啊小古银";
}
没错,编译器会把这种写法当作函数的声明,而不是创建对象。所以你要注意,别写错了。
不过,如果写成下面这样是没有问题的:
std::string create_string = std::string();
这是把一个std::string
右值赋值给变量create_string
。
巩固练习
- 使用无参数的构造函数对
simple_vector
的两个成员变量进行初始化。 - 添加新的构造函数:
simple_vector(std::size_t n, int value = int());
。它的作用是:在初始化时创建n
个元素, 这些元素的初始值都是value
。 simple_vector
的成员函数empty()
和size()
,完成这两个成员函数的定义。