#ifndef STOCK00_H
#define STOCK00_H
#include <string>
class Stock
{
private:
std::string company;
long shares;
double share_val;
double total_val;
void set_tot() { total_val = shares * share_val; } // 自动变为内联函数
public:
void acquire(const std::string& co, long n, double pr);
void buy(long num, double price);
void sell(long num, double price);
void update(double price);
void show();
}; // note semicolon at the end;
#endif
访问控制
C++中的类成员默认是private的,即不可外部访问,只有显式定义为public才可为外部访问。
实现类成员函数
-
定义成员函数时,使用作用域解析符(::)来标识函数所属的类;
-
类方法可以访问类的private组件。
例如:
void Stock:: update(double priice) { }
NOTE:
- 定义在类声明中的函数都自动变为内联函数,例如上述中的set_tot()函数。
使用类
要创建类对象,可以声明类变量,也可以使用new为类对象分配存储空间。类和结构体类似。
-
声明类变量
Stock cat;// 声明一个类变量 cat.acquire("NanoSmart", 20, 12.50); cat.show(); cat.buy(15, 18.125); cat.show();
-
new
Stock* cat = new Stock(); cat->acquire("NanoSmart", 20, 12.50); cat->show(); cat->buy(15, 18.125); cat->show();
构造函数和析构函数
class Stock
{
private:
std::string company;
long shares;
double share_val;
double total_val;
void set_tot() { total_val = shares * share_val; }
public:
void acquire(const std::string& co, long n, double pr);
void buy(long num, double price);
void sell(long num, double price);
void update(double price);
void show();
Stock(); // Default constructor;
Stock(const std::string & co, long n = 0, double pr = 0.0);
~Stock(); // noisy destructor
}; // note semicolon at the end;
- 构造函数
-
可重载, public
-
C++11 列表初始化
可以使用列表初始化语法来初始化结构体和类,只要提供与某个构造函数的参数列表匹配的内容即可。
//Stock stock1("NanoSmart", 12, 20.0); //Stock stock1 = { "NanoSmart", 12, 20.0 }; Stock stock1{ "NanoSmart", 12, 20.0 };
-
如果构造函数里面使用了new分配内存,则必须在析构函数中使用delete释放内存。
-
析构函数
如果构造函数里面使用了new分配内存,则必须在析构函数中使用delete释放内存。
const 成员函数
在定义const类时,保证要调用的成员函数为const,即保证成员函数不会更改类变量。
const Stock land = Stock("Kliu Prodsa");
land.show(); // show 必须为const, 但是根据Stock的定义,show为void,所以C++11 新语法为
//声明
void show() const;
// 定义
void Stock::show() const{
}
this指针
问题:
const Stock & Stock::topval(const Stock & s) const{
if(s.total_val > total_val)
return s; // 返回参数对象
else
return ????;// 返回被调用对象
}
可以使用this指针因为返回的是引用,而this是对象的地址,所以应该返回
return *this;
运算符重载
运算符函数的格式如下:
operatorop(argument-list)
友元
C++控制对类对象私有部分的访问,通常,公有类方法提供唯一的访问途径,但是有时候这种限制太严格,以至于不适合特定的编程问题,在这种情况下,C++提供了另外一种形式的访问权限:友元。
-
创建友元
friend Time operator*(double m, const Time & t);
创建友元函数的第一步就是将其原型放在类声明中,并在原型声明前加上关键字friend,该原型意味着:
-
虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;
-
虽然operator*()函数不是成员函数,但它与成员函数的访问权限相同。
友元函数的定义:(不要加Time::限定符)
Time operator*(double m, const Time & t) { }