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];
【问题讨论】:
您必须定义“无法复制信息”的含义,因为这可能意味着任何事情。析构函数是什么样的?我的猜测是析构函数正在删除newName
和 newLocation
字符串。您是否有理由不使用 const char*
而不是 std::string
?
我的意思是当构造函数遍历完初始化列表后,我在内存中查看item
、nextByName
和nextByRating
。 nextByName
和 nextByRating
已初始化为 NULL
,但 item
的所有四个部分仍然具有 Visual Studio 默认内存值(0xcdcdcdcd、0xfeeffeef 等)以及我使用 @987654336 的原因@ 是因为我们被禁止使用std::string
。
【参考方案1】:
从外观上看,这几行:
char *newName = new char[sizeof(name) + 1];
char *newLocation = new char[sizeof(location) + 1];
基本上什么都不做,因为location
和name
字符串没有分配甚至写入,这可能是问题的根源。但是,您的 acres
和 rating
应该已正确构造。
这是我创建的工作版本(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++中的构造函数的主要内容,如果未能解决你的问题,请参考以下文章