第1关:为类提供默认构造函数
任务描述
本关有一个未完成的类 Int
,该类含有一个成员变量,请为该类提供一个默认构造函数。默认构造函数的功能是将该成员变量初始化为 0。
相关知识
构造函数用于完成在类对象定义时所需要的初始化操作。构造函数与类同名。一般而言,构造函数不需要用户显式的调用,而是由系统在定义语句中自行调用。默认构造函数就是指无参的构造函数。有时候,拥有缺省参数值的构造函数也可以充当默认构造函数的用途。 如果用户不提供任何构造函数,系统会自行为用户添加一个默认构造函数。 考虑如下类:
class Int{
private:
int value;
public:
Int(){value=0;}
};
为 Int
类提供了一个默认构造函数,并在函数中将 value 设置为 0。这个函数从功能上而言,没有问题。但很遗憾的,这是赋值而不是初始化。 赋值和初始化的区别可以考虑下面两段代码:
int a;
a = 3;//这是赋值
int a = 3;//这是初始化
C++ 倾向于使用初始化,至于原因,此处不进行阐述。 如何在类的构造函数中使用初始化而不是赋值呢?答案是成员列表初始化。语法如下:
class Int{
... //成员省略
public:
Int():a(0){}
//:a(0)就是成员列表初始化,如果有多个成员,用逗号隔开
}
编程要求
根据提示,在右侧编辑器的Begin-End区域内补充代码。
测试说明
一共包含2个文件,main.cpp 和 Int.h。 用户仅能修改 Int.h 中的内容。 main.cpp 的内容如下:
#include "Int.h"
#include <iostream>
using namespace std;
int main(){
Int a;
cout<<a.getValue()<<endl;
return 0;
}
/**
* 这是一个包装类(wrapper class),包装类在C++中有点小小的用处(基本上没用),在Java中的用处更大一些。
*/
#ifndef _INT_H_ //这是define guard
#define _INT_H_ //在C和C++中,头文件都应该有这玩意
class Int{
private://这是访问控制——私有的
int value; //这是数据成员,我们称Int是基本类型int的包装类,就是因为Int里面只有一个int类型的数据成员
public: //这是公有的
//请在以下空白书写默认构造函数,即不带参数的构造函数
/********** Begin **********/
Int(){
value = 0;
}
/********** End **********/
//请不要改动以下成员函数
int getValue()const{return value;}
};//记住这里有一个分号
#endif
第2关:为类提供拷贝构造函数
任务描述
本关有一个未完成的类 Int
,该类含有一个成员变量,请为该类提供一个拷贝构造函数。拷贝构造函数必须是以本类型的常引用作为参数,其功能是构造出一个与参数内容一模一样的对象。
相关知识
构造函数用于完成在类对象定义时所需要的初始化操作。构造函数与类同名。一般而言,构造函数不需要用户显式的调用,而是由系统在定义语句中自行调用。 拷贝构造函数在实参向形参的单向值传递的过程中起到重要作用。 如果用户不提供拷贝构造函数,系统会自行为用户添加一个拷贝构造函数。
编程要求
根据提示,在右侧编辑器的Begin-End区域内补充代码。
测试说明
一共包含 2 个文件,main.cppv 和 vInt.h。 用户仅能修改 vInt.hv 中的内容。
注意:除了提供拷贝构造函数意外,还需提供默认构造函数。
main.cppv 的内容如下:
#include "Int.h"
#include <iostream>
using namespace std;
int main(){
int x;
cin>>x;
Int a;
a.setValue(x);
Int b(a);
cout<<b.getValue()<<endl;
return 0;
}
/**
* 这是一个包装类(wrapper class),包装类在C++中有点小小的用处(基本上没用),在Java中的用处更大一些。
*/
#ifndef _INT_H_ //这是define guard
#define _INT_H_ //在C和C++中,头文件都应该有这玩意
class Int{
private://这是访问控制——私有的
int value; //这是数据成员,我们称Int是基本类型int的包装类,就是因为Int里面只有一个int类型的数据成员
public: //这是公有的
//请在以下空白书写拷贝构造函数,即以本类的常引用为参数的构造函数
/********** Begin **********/
Int(){
value = 0;
}
Int(Int const& a){
value = a.value;
}
/********** End **********/
//请不要改动以下成员函数
int getValue()const{return value;}
void setValue(int v){value=v;}
};//记住这里有一个分号
#endif
第3关:为类提供功能构造函数
任务描述
本关有一个未完成的类 Int
,该类含有一个成员变量,请为该类提供一个指定功能的构造函数。该构造函数拥有一个 int
类型的参数,其功能是构造一个 Int
对象,其成员与参数值相等。
相关知识
构造函数用于完成在类对象定义时所需要的初始化操作。构造函数与类同名。一般而言,构造函数不需要用户显式的调用,而是由系统在定义语句中自行调用。
编程要求
根据提示,在右侧编辑器的Begin-End区域内补充代码。
测试说明
一共包含 2 个文件,main.cpp 和 Int.h。 用户仅能修改 Int.h 中的内容。 main.cpp 的内容如下:
#include "Int.h"
#include <iostream>
using namespace std;
int main(){
int x;
cin>>x;
Int a(x);
cout<<a.getValue()<<endl;
return 0;
}
/**
* 这是一个包装类(wrapper class),包装类在C++中有点小小的用处(基本上没用),在Java中的用处更大一些。
*/
#ifndef _INT_H_ //这是define guard
#define _INT_H_ //在C和C++中,头文件都应该有这玩意
class Int{
private://这是访问控制——私有的
int value; //这是数据成员,我们称Int是基本类型int的包装类,就是因为Int里面只有一个int类型的数据成员
public: //这是公有的
//请在以下空白书写功能构造函数,此处要求以一个整型作为参数
/********** Begin **********/
Int(int input){
value=input;
}
/********** End **********/
//请不要改动以下成员函数
int getValue()const{return value;}
};//记住这里有一个分号
#endif
第4关:为类提供构造函数重载
任务描述
为 Int
类提供 3 个构造函数,分别是默认构造函数、拷贝构造函数和指定功能的构造函数。 这个例子说明,构造函数是可以重载的。其重载规则与普通函数并无不同。
相关知识
构造函数用于完成在类对象定义时所需要的初始化操作。构造函数与类同名。一般而言,构造函数不需要用户显式的调用,而是由系统在定义语句中自行调用。
编程要求
根据提示,在右侧编辑器的Begin-End区域内补充代码。
测试说明
一共包含 2 个文件,main.cpp 和 Int.h。 用户仅能修改 Int.h 中的内容。 main.cpp 的内容如下:
#include "Int.h"
#include <iostream>
using namespace std;
int main(){
int x;
cin >> x;
Int a;
Int b(x);
Int c(b);
cout<<a.getValue()<<" "<<b.getValue()<<" "<<c.getValue()<<endl;
return 0;
}
/**
* 这是一个包装类(wrapper class),包装类在C++中有点小小的用处(基本上没用),在Java中的用处更大一些。
*/
#ifndef _INT_H_ //这是define guard
#define _INT_H_ //在C和C++中,头文件都应该有这玩意
class Int{
private://这是访问控制——私有的
int value; //这是数据成员,我们称Int是基本类型int的包装类,就是因为Int里面只有一个int类型的数据成员
public: //这是公有的
//请在以下空白书写构造函数重载,须提供3个构造函数
/********** Begin **********/
Int(){
value = 0;
}
Int(int input){
value = input;
}
Int(Int const& a){
value = a.value;
}
/********** End **********/
//请不要改动以下成员函数
int getValue()const{return value;}
};//记住这里有一个分号
#endif