• Index

构造函数和初始化列表

Reads: 28

下面先总结一下构造函数的相关知识:

  1. 成员变量都是在构造函数内被创建并且分配内存的。
  2. 成员变量需要在构造函数中初始化。
  3. 当不写构造函数时,编译器会添加一个默认构造函数,默认构造函数是无参数的构造函数。
  4. 当类中只要有一个构造函数时,编译器就不会添加默认构造函数。

构造函数

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

巩固练习

  1. 使用无参数的构造函数对simple_vector的两个成员变量进行初始化。
  2. 添加新的构造函数:simple_vector(std::size_t n, int value = int());。它的作用是:在初始化时创建n个元素, 这些元素的初始值都是value
  3. simple_vector的成员函数empty()size(),完成这两个成员函数的定义。

Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.