4.C++对象和类

#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;
  • 构造函数
  1. 可重载, public

  2. C++11 列表初始化

    可以使用列表初始化语法来初始化结构体和类,只要提供与某个构造函数的参数列表匹配的内容即可。

    //Stock stock1("NanoSmart", 12, 20.0);
    //Stock stock1 = { "NanoSmart", 12, 20.0 };
    Stock stock1{ "NanoSmart", 12, 20.0 };
    
  3. 如果构造函数里面使用了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,该原型意味着:

  1. 虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;

  2. 虽然operator*()函数不是成员函数,但它与成员函数的访问权限相同。

    友元函数的定义:(不要加Time::限定符

    Time operator*(double m, const Time & t)
    {
        
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值