前端学C++

135 阅读1分钟

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

C++ class

有人这样描述C++的优势:高性能实现面向对象。class显然是学习C++的重中之重。

C++类定义与类

上一个C++ premier plus中的例子

// stock10.h 
#ifndef STOCK10_H_ 
#define STOCK01_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: // two constructors 
    Stock(); // default constructor 
    Stock(const std::string & co, long n = 0, double pr = 0.0); 
    ~Stock(); // noisy destructor 
    void buy(long num, double price); 
    void sell(long num, double price); 
    void update(double price); 
    void show(); 
}; 
#endif

包含stock类定义的头文件,几个注意点:通过private定义的方法与变量无法在外界通过实例直接修改,需要借助public实现的方法来进行修改;与类同名的函数为构造函数,在实例化类时自动调用;~Stock()为析构函数,在类的内存释放时调用。

// stock10.cpp -- Stock class with constructors, destructor added 
#include <iostream>
#include "stock10.h"


Stock::Stock() // default constructor 
{ 
    std::cout << "Default constructor called\n"; 
    company = "no name"; 
    shares = 0; 
    share_val = 0.0; 
    total_val = 0.0; 
} 
Stock::Stock(const std::string & co, long n, double pr) { 
    std::cout << "Constructor using " << co << " called\n"; 
    company = co; 
    if (n < 0) { 
        std::cout << "Number of shares can’t be negative; " << company << " shares set to 0.\n"; shares = 0; 
    } else 
        shares = n; 
    share_val = pr; 
    set_tot(); 
} 
// class destructor 
Stock::~Stock() // verbose class destructor 
{ 
    std::cout << "Bye, " << company << "!\n"; 
}
//  其他的方法实现省略

此处注意使用::操作符

Stock stock1("NanoSmart", 12, 20.0);
Stock stock2 = Stock ("Boffo Objects", 2, 2.0); 
stock1 = Stock("Nifty Foods", 10, 50.0); // temporary object

三种方法都可以给实例化类变量,区别是:第一种不产生临时变量;第二种有可能产生临时变量,视编译器而定;第三种一定会产生。

Stock hot_tip = {"Derivatives Plus Plus", 100, 45.0}; 
Stock jock {"Sport Age Storage, Inc"}; 
Stock temp {};

之前的文章有讨论过C++ 11后的{}初始化,{}被称为通用初始化方法,正是因为其同时用于初始化类和基础类型的能力。这里一二条调用后一个构造函数,而无参数的第三条调用默认构造函数。

类的this

作为一个前端,this真的是太熟悉了,当然C++ class中的this指针不像JS中的那样涉及原型链那一堆,它主要是提供指向当前类的指针。一个很简单的例子来说明其应用:

\\ 声明
const Stock & Stock::topval(const Stock & s) const 
{ 
    if (s.total_val > total_val) 
        return s; 
    else 
        return *this; 
}
\\ 调用,获取两个class实例total_val更大的那个
top = stock1.topval(stock2); 
top = stock2.topval(stock1);