c++中的构造函数

Posted Explosion!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中的构造函数相关的知识,希望对你有一定的参考价值。

c++构造函数

C++中的构造函数可以分为一下几种:

  • 默认构造函数
  • 初始化构造函数(有参数)
  • 拷贝构造函数
  • 移动构造函数(move和右值引用)
  • 委托构造函数
  • 转换构造函数
#include <iostream>
using namespace std;

class Student
public:
    Student()//默认构造函数,没有参数
        this->age = 20;
        this->num = 1000;
    ;  
    Student(int a, int n):age(a), num(n); //初始化构造函数,有参数和参数列表
    Student(const Student& s)//拷贝构造函数,这里与编译器生成的一致
        this->age = s.age;
        this->num = s.num;
    ; 
    Student(int r)   //转换构造函数,形参是其他类型变量,且只有一个形参
        this->age = r;
        this->num = 1002;
    ;
    ~Student()
public:
    int age;
    int num;
;
int main()
    Student s1;
    Student s2(18,1001);
    int a = 10;
    Student s3(a);
    Student s4(s3);
    
    printf("s1 age:%d, num:%d\\n", s1.age, s1.num);
    printf("s2 age:%d, num:%d\\n", s2.age, s2.num);
    printf("s3 age:%d, num:%d\\n", s3.age, s3.num);
    printf("s2 age:%d, num:%d\\n", s4.age, s4.num);
    return 0;

//运行结果
//s1 age:20, num:1000
//s2 age:18, num:1001
//s3 age:10, num:1002
//s2 age:10, num:1002
  • class Person
    
    public:
        Person() :Person(1, \'a\')                 //委托构造函数
        Person(int i) : Person(i, \'a\')            //委托构造函数
        Person(char ch) : Person(1, ch)      //委托构造函数
     
    private:
        Person(int i, char ch) :type(i), name(ch) /*其他初始化信息*/
        int type 1 ;
        char name \'a\' ;
    ; 

     

  • 默认构造函数和初始化构造函数在定义类的对象,完成对象的初始化工作
  • 复制构造函数用于复制本类的对象
  • 转换构造函数用于将其他类型的变量,隐式转换为本类对象

 

转载文章:https://interviewguide.cn/notes/03-hunting_job/02-interview/01-01-02-basic.html

构造函数中的 C++ 初始化列表

【中文标题】构造函数中的 C++ 初始化列表【英文标题】:C++ initialization list in constructor 【发布时间】:2014-10-11 02:23:11 【问题描述】:

我正在尝试使用另一个名为“List”的类的构造函数中的初始化列表来初始化名为“Winery”的类的实例。问题是,当我将 Winery 构造函数交给一个要复制的酒厂时,它无法复制信息。

这是 Winery 类的头文件:

class Winery

public:

    Winery(const char * const name, const char * const location, const int acres, const int rating);
    virtual ~Winery(void);

    const char * const getName() const  return name; 
    const char * const getLocation() const  return location; 
    const int getAcres() const  return acres; 
    const int getRating() const  return rating; 

private:
    char    *name;
    char    *location;
    int     acres;
    int     rating;
;

这是我的 List 类的头文件的相关部分:

struct Node
    
        Node(const Winery& winery);     
        Winery item;                                            
        Node *nextByName;               
        Node *nextByRating;             
    ;

这是我的 List 类中的构造函数:

List::Node::Node(const Winery& winery) :
item(winery.getName(), winery.getLocation(), winery.getAcres(), winery.getRating()),
nextByName(nullptr),
nextByRating(nullptr)


在我看来,我似乎正在做我需要做的一切。我传递给构造函数的酒厂数据成员是私有的,所以我试图通过获取信息的函数来获取它们。他们的顺序和一切都是正确的。初始化它们后指针工作得很好,但信息不存在,所以我真的不知道该怎么做。如果您想知道,这是一个分配,我们必须使用初始化列表(我已经尝试过没有它们,但它也不起作用,所以我真的不知道该怎么做)。我将不胜感激任何帮助!谢谢!

编辑:这是我的酒厂构造函数:

Winery::Winery(const char * const name, const char * const location, const int acres, const int rating) :
acres(acres),
rating(rating)

    char *newName = new char[sizeof(name) + 1];
    char *newLocation = new char[sizeof(location) + 1];

【问题讨论】:

您必须定义“无法复制信息”的含义,因为这可能意味着任何事情。析构函数是什么样的?我的猜测是析构函数正在删除 newNamenewLocation 字符串。您是否有理由不使用 const char* 而不是 std::string 我的意思是当构造函数遍历完初始化列表后,我在内存中查看itemnextByNamenextByRatingnextByNamenextByRating 已初始化为 NULL,但 item 的所有四个部分仍然具有 Visual Studio 默认内存值(0xcdcdcdcd、0xfeeffeef 等)以及我使用 @987654336 的原因@ 是因为我们被禁止使用std::string 【参考方案1】:

从外观上看,这几行:

char *newName = new char[sizeof(name) + 1];
char *newLocation = new char[sizeof(location) + 1];

基本上什么都不做,因为locationname 字符串没有分配甚至写入,这可能是问题的根源。但是,您的 acresrating 应该已正确构造。

这是我创建的工作版本(ideone here -> http://ideone.com/v98zpq)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

class Winery

public:
    Winery(const char * const name, const char * const location, const int acres, const int rating) :
        name(strdup(name)),
        location(strdup(location)),
        acres(acres),
        rating(rating)
    
    

    virtual ~Winery(void)
    
        free(name);
        free(location);
    

    const char * const getName() const  return name; 
    const char * const getLocation() const  return location; 
    const int getAcres() const  return acres; 
    const int getRating() const  return rating; 

private:
    char    *name;
    char    *location;
    int     acres;
    int     rating;
;

struct Node

    Node(const Winery& winery);
    Winery item;
;

Node::Node(const Winery& winery) :
    item(winery.getName(), winery.getLocation(), winery.getAcres(), winery.getRating())



int main()

    Winery winery("Mission Hill Winery", "Kelowna, BC, Canada", 646, 4);

    Node node(winery);

    printf("%s\n", node.item.getName());
    printf("%s\n", node.item.getLocation());
    printf("%i\n", node.item.getAcres());
    printf("%i\n", node.item.getRating());

输出:

Mission Hill Winery
Kelowna, BC, Canada
646
4

【讨论】:

以上是关于c++中的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

构造函数中的 C++ 初始化列表

c++中的构造函数和析构函数

什么是 C++ 中的就地构造函数? [复制]

函数调用或构造函数调用中的 C++ 数组初始化

如何验证 C++ 构造函数中的输入参数?

使用 g++ 中的版本脚本导出 c++ 构造函数