《C++ Primer Plus》学习笔记|第10章 对象和类 (24-12-2更新)
文章目录
- 10.3 类的构造函数和析构函数
- 10.3.2 使用构造函数
- 显式地调用构造函数
- 隐式地调用构造函数
- 使用对象指针
- 10.3.3默认构造函数
- 10.3.4 析构函数
- 析构函数示例
- 10.4 this指针
- 三个const的作用
- 10.5 对象数组
- 10.6 类作用域
- 10.9 复习题
- 1.什么是类?
- 2.类如何实现抽象、封装和数据隐藏?
- 3.对象和类之间的关系是什么?
- 4.除了是函数之外,类函数成员与类数据成员之间的区别是什么?
- 6.类构造函数在何时被调用?类析构函数呢?
- 8.什么是默认构造函数,拥有默认构造函数有何好处?
- 10.this和\*this是什么?
10.3 类的构造函数和析构函数
C++提供了一个特殊的成员函数——类构造函数,专门用于构造新对象、将值赋给它们的数据成员。
10.3.2 使用构造函数
有两种构造函数:显式地和隐式地
显式地调用构造函数
Stock food = Stock("World Cabbage",250,1.25);
隐式地调用构造函数
Stock food("World Cabbage",250,1.25);
另外可以使用对象指针进行管理
使用对象指针
Stock *pstock = new Stock("Electroshock Gmes", 18,19.0);
对象没有名称,使用对象指针来管理该对象
10.3.3默认构造函数
如果没有提供任何构造函数,则C++将自动提供默认构造函数。
Stock fluffy_the_cat;
创建对象,但不初始化器成员
1、如果自己定义了构造函数:则不应该使用默认的构造函数。
2、如果自己没有定义构造函数:则使用默认的构造函数。
如果如果提供了非默认构造函数(如Stock(const char * co, int n, double pr)),但没有提供默认构造函数,则下面的声明将出错
Stock stock1;
下面是为Stock类定义的一个默认构造函数:
Stock::Stock(){ //default constructor
company = "no name";
shares =0;
share val =0.0;
total val =0.0;
}
10.3.4 析构函数
- Stock类的析构函数为~Stock( )。
- 和构造函数一样,析构函数 也可以没有返回值和声明类型。
- 与构造函数不同的是,析构函数没有参数,
析构函数示例
Stock::~Stock(){ //class destructor
cout << Bye,"<< company << "!\n";
}
10.4 this指针
在 C++ 中,this
指针是一个隐含在类的非静态成员函数中的指针。它指向调用该成员函数的对象本身。
当创建一个类的多个对象时,每个对象都有自己的数据成员,但成员函数只有一份代码。this
指针帮助区分是哪个对象在调用成员函数,并可以在成员函数中访问对象的数据成员和其他成员函数。
class Person {
private:
std::string name;
int age;
public:
void setName(std::string newName) {
this->name = newName;
}
void setAge(int newAge) {
this->age = newAge;
}
};
三个const的作用
const Stock &topval(const Stock &s)const;
函数返回值前的const
防止返回值被修改
函数参数中的const
防止函数内部意外修改传入参数
函数声明末尾的const
防止函数修改调用它的对象。
10.5 对象数组
声明对象数组的方法与 声明标准类型数组相同:
Stock mystuff[4];
可以用构造函数来初始化数组元素:
const int STKS=4;
Stock stocks[STKS]={
Stock("NanoSmart",12.5,20),
Stock("Boffo objects",200,2.0),
Stock("Monolithic Obelisks",130,3.25),
Stock("Fleep Enterprises",60,6.5)
};
如果类包含多个构造函数,则可以对不同的元素使用不同的构造函数:
const int STKS=10;
Stock stocks[STKS]={
Stock("NanoSmart",12.5,20),
Stock(),
Stock("Monolithic obelisks",130,3.25)
};
由于该声明只初始化了数组的部分元素,因此余下的7个元素将使用默认构造函数进行初始化。
10.6 类作用域
在类中定义的名称(如类数据成员名和类成员函数名)的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外是不可知的。这样的作用域被称为类作用域。
使用对象指针的方式访问该对象的成员函数:
class Ik
{
...
void ViewIK();
...
}
int main(){
Ik *pik = new Ik;
pik->ViewIk();
}
10.9 复习题
1.什么是类?
类是用户定义的类型的定义。类声明指定了数据将如何存储,同时提供了访问和操作这些数据的方法。
2.类如何实现抽象、封装和数据隐藏?
用户可以根据类的公有接口对类对象执行的操作,这是抽象。类的数据成员可以是私有的(默认值),这意味着只能通过类成员函数来对数据进行访问,这是数据隐藏。实现的具体细节(如数据的表示和方法的代码)都是隐藏的,这是封装。
3.对象和类之间的关系是什么?
类定义了一种类型,包括如何使用它。对象是一个变量或其他的数据对象(如new生成的),并根据类定义被创建和使用。类和对象之间的关系同标准类型与其变量之间的关系。
4.除了是函数之外,类函数成员与类数据成员之间的区别是什么?
如果创建给定类的多个对象,则每个对象都有其自己的数据内存空间;但所有的对象都使用同一组成员函数(通常,这个方法是公有的,而数据是私有的,但这只是策略方面的问题,而不是对类的要求)
6.类构造函数在何时被调用?类析构函数呢?
在创建类对象或显示调用构造函数时,类的构造函数被调用。当函数过期时,析构函数被调用。
8.什么是默认构造函数,拥有默认构造函数有何好处?
默认构造函数是没有参数或所有参数都有默认值的构造函数。拥有默认构造函数后,可以声明对象,而不初始化它,即使已经定义了初始化构造函数。它还使得能够声明数组。
10.this和*this是什么?
this指针是类方法可以使用的指针,它指向用于调用方法的对象。因此,this是对象的地址,*this是对象本身。