欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解C++构造函数

程序员文章站 2022-07-02 08:58:36
目录1.作用2.代码举例2.1 示例1:2.2 示例2:3. 使用3.1 使用构造函数初始化3.2 有参数的构造函数3.3 默认的构造函数4. 成员初始化列表例1:正常初始化例2:成员初始化列表为啥推...

1.作用

一种特殊类型的方法,在每次实例化对象时运行

2.代码举例

2.1 示例1:

#include <iostream>
class a
{
    public:
        float a, b;
        void print()
        {
            std::cout << a <<  " ,  " << b << std :: endl;
        }
};
int main()
{
    a a;
    a.print();
    return 1;
}

运行结果:

详解C++构造函数

当我们实例化a,系统为它分配内存,我们没有初始化内存,得到的是内存空间原有的那些东西

2.2 示例2:

当在main中添加 std::cout << a.a << " , " << a.b << std :: endl;

int main()
{
    a a;
    std::cout << a.a <<  " ,  " << a.b << std :: endl;
    a.print();
    return 1;
}

(ubuntu下 vs code )运行结果

详解C++构造函数

不同编译器可能不一样,有的会编译不过报错(未初始化局部变量),原因有待深入…

3. 使用

3.1 使用构造函数初始化

#include <iostream>
class a
{
    public:
        float a, b;
        a ()
        {
            a = 0.0f;
            b = 0.0f;
        }
        void print()
        {
            std::cout << a <<  " ,  " << b << std :: endl;
        }
};
int main()
{
    a a;
    std::cout << a.a <<  " ,  " << a.b << std :: endl;
    a.print();
    return 1;
}

结果:

详解C++构造函数

3.2 有参数的构造函数

#include <iostream>
class a
{
    public:
        float a, b;
    // 无参构造
    a ()
        {
            a = 0.0f;
            b = 0.0f;
        }
    // 有参构造
        a(float c,float d)
        {
            a = c;
            b = d;
        }
    
        void print()
        {
            std::cout << a <<  " ,  " << b << std :: endl;
        }
};
int main()
{
    a a(5.0,6.0);
    std::cout << a.a <<  " ,  " << a.b << std :: endl;
    a.print();
    return 1;
}

一个类可以有很多构造函数 前提是参数个数不同或者参数类型不同

类似于同名函数(函数重载 即有相同的函数名,但是有不同的参数个数与参数类型)

 a(float c,float d)
 {
 }
a(int c,int d)
{
}
a(float c,float d,float e)
{
}

这里需要注意有参构造的时候注意传值类型

float 类型

a a(5.0f , 6.0f);

3.3 默认的构造函数

每个类默认有一个空参空实体的构造函数(如果写了构造函数,则默认构造函数就没有了,需要时需手动添加)

a ()
{
}

如果不想使用构造函数有两种方法

// 1 私有化
private :
	a(){}
// 2 删掉
a() = delete;

4. 成员初始化列表

例1:正常初始化

#include <iostream>
using namespace std;
class student
{
private:
    const char *m_name;
    int m_age;
    float m_score;
public:
    // 无参构造 给变量赋定值
    student()
    {
        m_name = "aaa";
        m_age = 1;
        m_score = 99.0;
    }
    // 有参构造  给变量动态赋值
    student(const char *name, int age, float score)
    {
        m_name = name;
        m_age = age;
        m_score = score;
    }
    void print ()
    {
        cout << m_name << " ," << m_age  <<  " ," <<  m_score << endl;
    }
};
int main(int argc, char const *argv[])
{
    student s1;
    s1.print();
    student s2("ccc" , 2 , 99.3f);
    s2.print();
    return 0;
}

例2:成员初始化列表

#include <iostream>
#include <string>
using namespace std;
class student
{
private:
    // string m_name;
    // char *m_name;
    const char *m_name;
    int m_age;
    float m_score;
public:   
    //  无参 成员初始化列表  
    student() 
        : m_name("bbb") , m_age(2) , m_score(93.0f) 
    {
        // todo
    }
    // 有参 成员初始化列表  
    /**
     *  const char *name    常量指针     const 修饰*name   *name不可改变
     *  char * const name   指针常量     const 修饰 name   name不可改变
     *  char const *name    常量指针 等同于 const char *name 
     * 
     *  这里不写const 会报警告  但可以编过  
     *  
    */
    student(const char *name, int age, float score)
        : m_name(name) , m_age(age) , m_score(score)
    {
       // todo
    }
    void print ()
    {
        cout << m_name << " ," << m_age  <<  " ," <<  m_score << endl;
    }
};
int main(int argc, char const *argv[])
{
    student s1;
    s1.print();
    student s2("ccc",2,99.3f);
    s2.print();
    return 0;
}

运行结果都一样:

aaa ,1 ,99
ccc ,2 ,99.3

使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。

初始化列表可以用于全部成员变量,也可以只用于部分成员变量

student(char *name, int age, float score): m_name(name){
    m_age = age;
    m_score = score;
}

note:成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。

为啥推荐成员初始化列表的写法?

#include <iostream>
using namespace std;
class example
{
public:
    example()
    {
        cout<< "create example" << endl;
    }
    example(int x)
    {
        cout<< "create example with "  << x << endl;
    }
};
class a
{
private:
    string m_name;
    // 创建了 example 的无参构造 对象
    example m_example;
public:
    a()
    {
        m_name = "name";
        // 创建新的有参构造对象覆盖第一次赋值  
        m_example = example(1);
    }
};
int main(int argc, char const *argv[])
{
    a a;
    return 0;
}

结果:

详解C++构造函数

a的构造函数换成成员初始化列表的写法

//    a() : m_name ("name"),m_example(example(1))  		与下面写法相同
a() : m_name ("name"),m_example(1)
    {
    }

结果:

详解C++构造函数

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!