这是我参与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);