头歌Educoder实验:程序设计二(面向对象)_实训2_构造函数

第1关:为类提供默认构造函数

任务描述

本关有一个未完成的类 Int,该类含有一个成员变量,请为该类提供一个默认构造函数。默认构造函数的功能是将该成员变量初始化为 0。

相关知识

构造函数用于完成在类对象定义时所需要的初始化操作。构造函数与类同名。一般而言,构造函数不需要用户显式的调用,而是由系统在定义语句中自行调用。默认构造函数就是指无参的构造函数。有时候,拥有缺省参数值的构造函数也可以充当默认构造函数的用途。 如果用户不提供任何构造函数,系统会自行为用户添加一个默认构造函数。 考虑如下类:

class Int{
private:
    int value;
public:
    Int(){value=0;}
};

Int 类提供了一个默认构造函数,并在函数中将 value 设置为 0。这个函数从功能上而言,没有问题。但很遗憾的,这是赋值而不是初始化。 赋值和初始化的区别可以考虑下面两段代码:

 
  1. int a;
  2. a = 3;//这是赋值
 
  1. 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

  • 4
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风绪Fengxu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值