c++类与对象疑难小结

类的定义

参考代码:定义一个网上购书订单类BookOrder,包含的内容如下:
(1) 私有成员变量BookID,表示图书编号,类型为string;
(2) 私有成员变量Quantity,表示图书的数量,类型为int;
(3) 公有成员变量price,表示图书的单价,类型为double;
(4) 公有成员函数BookInit,实现使用参数为成员变量赋值;
(5) 公有成员函数BookInfo,实现显示订单信息,包括图书编号、单价、 数量、总价。
(6) 可以根据任务要求自行设计其它需要的成员函数。

编写主程序实现如下功能:
(1) 创建图书订单类的一个对象bookOrder;
(2) 交互地由用户输入订单信息,包括图书编号、数量、单价;
(3) 调用成员函数BookInit使用用户输入的信息设置bookOrder的成员变量的值;
(4) 调用成员函数BookInfo显示图书订单bookOrder的内容;
(5) 根据用户输入的该图书编号的折扣,计算折扣后单价,修改图书订单bookOrder的单价为现有单价;
(6) 再次调用成员函数BookInfo显示图书订单bookOrder的内容。

#include<iostream>
#include<string>
using namespace std;
class BookOrder {
private:
    string BookID = "";
    int Quantity = 0;

public:
    double price = 0;
    void BookInit(string s, int num, double p);//设定书的参数
    void BookInfo();
};
void BookOrder::BookInit(string s, int num, double p) {
    BookID = s;
    Quantity = num;
    price = p;
}

void BookOrder::BookInfo() {
    cout << "图书编号";
    cout << this->BookID << endl;
    cout << "单价";
    cout << this->price << endl;

}
int main()
{
    BookOrder bkorder;
    string id;
    float count;
    double pr;
    int quan;
    cout << "输入图书编号:";
    cin >> id;
    cout << "输入数量和单价:";
    cin >> quan >> pr;
    bkorder.BookInit(id, quan, pr);
    bkorder.BookInfo();
    cout << "输入该编号图书折扣(0-1之间):";
    cin >> count;
    bkorder.BookInit(id,quan,pr*count);
    cout << "单价调整后:" << endl;
    bkorder.BookInfo();
    return 0;
}

注:1定义的两种方法

 BookOrder bkorder;
class BookOrder bkorder;
2  与class相似的struct将所有成员默认为public.
3数据成员可以是另一个类的对象或指向对象的指针,还可以是自身类的指针或引用,但不能是自身类的对象。 

成员函数

方法一:声明时就给出定义

public:
    int geta() { return a; }
//此种方法会被处理为内联函数。

方法二:在类的外部定义,如上面BookOrder中所示(声明中形参名可以省略)。
注:在函数原型后加const可以将函数设置为常量成员函数禁止其修改数据值。

数据地址及生存期

1:c++对象成员初始不初始化为0。
2:数据成员连续存放,成员函数连续存放但不与数据成员连续存放,函数是类所共有的只存放一个类。
3:成员的生存期与对象相同(对象数据成员的构造次序与类中的声明次序相同)

构造函数

例子:编写程序,定义一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有2个公有成员函数run、stop。其中,rank为char类型,frequency为单位是MHz的整形数、voltage为浮点型的电压值。观察构造函数、析构函数、成员函数的调用顺序。
要求:
1)当输入频率或电压小于等于0时,输出错误信息(信息见输入输出样例和模板)。
2)请使用模板中提供的cout输出语句,注意输出格式的一致性,中文信息输出使用中文标点,英文信息输出使用英文标点。
3)模板中仅提供函数名和参数个数。请自行添加函数参数类型和返回值类型和函数实现。

#include <iostream>
using namespace std;
class CPU {
private:
	char rank;
	long frequency;
	double voltage;

public:
	CPU(char r, long f, double V);
	~CPU();
	void Run();
	void Stop();
};
CPU::CPU(char r, long f, double V) {
	rank = r;
	frequency = f;
	voltage = V;
	cout << "构造一个CPU:" << endl;
	cout << "CPU等级" << rank << "主频" << frequency;
	cout << "电压:" << voltage << endl;
}
CPU::~CPU() {
	cout << "析构了一个CPU" << endl;
}
void CPU::Run() {
	cout << "CPU 开始运行!" << endl;
}
void CPU::Stop() {
	cout << "CPU 停止运行!" << endl;
}

int main()
{
	char r = NULL;
	long f = 0;
	double V = 0;
	cout << "Please input the rank of the CPU:";
	cin >> r;
	cout << "Please input the frequency of the CPU:";
	cin >> f;
	cout << "Please input the voltage of the CPU:";
	cin >> V;

	if (f <= 0) {
		cout << "Input Error:The frequency must be a number over 0!" << endl;
		return 0;
	}
	if (V <= 0) {
		cout << "Input Error:The voltage must be a number over 0!" << endl;
		return 0;
	}
	CPU cpu(r, f, V);
	cpu.Run();
	cpu.Stop();
	return 0;
}

注:1构造函数不能显示调用所以要修改数据值需要设定其他公有函数。
2有时会需要用默认构造函数,而一旦定义了一个构造函数,系统不会自动生成一个默认构造函数,需要自己设定。
3构造函数可重载。
4拷贝构造函数:用于根据已存在的对象初始化一个新对象。(编译器会自动构造默认拷贝函数),常用于带指针的类用以解决指针悬挂问题。
使用拷贝构造函数的情况a:用对象初始化同一类型的对象。
b:函数形参是对象,在传递时调用。
c:返回对象时。

#include <iostream>
using namespace std;
class X{};
X ob1;
X ob2 = ob1;//调用
X ob3(ob1);//调用
X f() {
	X t;
	return t;//调用
}

定义拷贝函数:

#include <iostream>
using namespace std;
class Person {
public:
	Person(const Person &p);
};
Person::Person(const Person& p) {
	name = new char[strlen(p.name) + 1];
	strcpy(name, p.name);
	age = p.age;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值