练习7.51 vector 将其单参数的构造函数定义成 explicit 的,而string
则不是,你觉得原因何在?
因为vector
的单参数构造函数指定的是vector
的期望大小,相当于构造了一个指定长度的空vector
,这显然不合常理的。而string
的单参数构造函数则是指定的string
的内容,可以在局部构造出一个string
类型的临时变量,这符合调用者的初衷,也可以提高编写程序的效率
练习7.52 使用2.6.1节的 Sales_data
类,解释下面的初始化过程。如果存在问题,尝试修改它。
Sales_data item = {"987-0590353403", 25, 15.99};
Sales_date
不是聚合类,不能以这种形式赋值,应该使用它的构造函数。
Sales_data item("987-0590353403", 25, 15.99/25);
练习7.53 定义你自己的 Debug
。
class Debug {
public:
constexpr Debug(bool b = true) : hw(b), io(b), other(b) { }
constexpr Debug(bool h, bool i, bool o) : hw(r), io(i), other(0) { }
constexpr bool any() { return hw || io || other; }
void set_hw(bool b) { hw = b; }
void set_io(bool b) { io = b; }
void set_other(bool b) { other = b; }
private:
bool hw; // runtime error
bool io; // I/O error
bool other; // the others
};
练习7.54 Debug
中以 set_
开头的成员应该被声明成 constexpr
吗?如果不,为什么?
不应该,因为他们需要设置错误的值,不可能有且只有一条返回语句。
练习7.55 7.5.5节的 Data
类是字面值常量类吗?请解释原因。
不是,因为Data
没有一个constexpr
的构造函数,而且std::string
不是字面值类下。
练习7.56 什么是类的静态成员?它有何优点?静态成员与普通成员有何区别?
是一些与类有关的变量和函数,而他们又不属于每一个实例化的对象,并且他们被所有类对象共享。它们可以在没有该类实际对象的情况下使用。而且可以类中静态对象的类型可以是类本身,也可以作为类中的默认参数。
练习7.57 编写你自己的 Account
类。
#pragma once
#include<string>
class Account{
void calculat() { amount += amount * interestRate; }
static double rate() { return interestRate; }
static void rate(double r) { interestRate = r; }
private:
std::string owner;
double amount;
static double interestRate;
};
练习7.58 下面的静态数据成员的声明和定义有错误吗?请解释原因。
//example.h
class Example {
public:
static double rate = 6.5;
static const int vecSize = 20;
static vector<double> vec;
};
//example.c
#include "example.h"
double Example::rate;
vector<double> Example::vec;
rate如果在类内初始化的必须是字面值常量类型。
//example.h
class Example {
public:
static constexpr double rate = 6.5;
static const int vecSize = 20;
static vector<double> vec(vecSize);
};
//example.c
#include "example.h"
double Example::rate;
vector<double> Example::vec(Example::vecSize);