类的定义
参考代码:定义一个网上购书订单类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;
}