第十章-类和对象
第十章 对象和类
本文是在阅读《C++primer》第六版时,对于对象和类的一些学习记录。
c++通过改进c使得,c++具有面向对象编程**(OOP)**的特性。所以要
区别的理解面向对象和之前在C中面向过程的不同的编程思想。
以下有一个关于类的定义
//stock00.h --stock class interface
//version 00
#ifndef STOCK00_H
#define STOCK00_H
#include <string>
class Stock // class declaration
{
private:
std::string company;
long shares;
double share_val;
double total_val;
void set_tot(){total_val = shares * shares * share_val}
public:
void acquire(const std::string & co, long n, double pr);
void buy(long num, double price);
boid sell(long num, double price);
void update(double price);
void show();
}; // note semicolon at the end
#endif
-
访问控制
关键字public和private实现。类对象的程序可以直接访问公有部分,但是只能通过公有成员函数私有部分 -
控制对成员的访问:公有还是私有
不必声明关键字private,因为这是类对象的默认访问控制。 -
对于类中定义的的函数都自动称为inline函数,如果愿意也可以类外定义成员函数,并使其成为inline函数。确保inline函数可用的最简单的方法是,将inline定义放在定义累的头文件中
-
类对象有自己的存储空间用来存储内部变量和类成员;但同一个类的对象共享同一组类方法,即每个方法只有一个副本
3.类的构造函数和析构函数
特别说明,构造函数没有声明类型。
使用构造函数的方法有两种:
- 显示调用
Stock food = Stock("world Change", 250, 1.25)
- 隐式调用
Stock garment("Furry Mason", 50, 2.5)
一般来说,使用对象来调用函数,但是无法使用对象来调用构造方法。
当且仅当没有提供默认的构造函数的时候,编译器才提供默认的构造函数。
析构函数完成清理工作。如果创建的是静态存储对象,析构函数在程序执行完代码块时自动的调用。如果创建的是自动存储类对象,代码块结束后调用。
特别说明,在类对象进行赋值的时候,是把原来类的成员的内容覆盖。
由于自动变量是存放在栈中的,因此对象析构的顺序是先创建的对象最后删除。
员函数不修改调用对象时将const作为关键字放在函数的括号后面
void show() const; // promise not to change invoking object
void stock::show() const; // promises not to change invoking object
4.this指针
每个成员函数(包括构造函数和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this.在函数的括号后面使用const限定符将this限定为const,这样讲不能使用this来修改对象的值。
要返回的并不是this,因为this是对象的地址,而对象本身身*this
5.对象数组
初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后利用提供的变量来构造一个临时对象,然后将临时对象的内容复制到相应的元素。
6.类作用域
类中定义的名称(数据成员和成员函数)的作用域属于整个类,作用域为整个类的名称只在该类中已知。
如果想创建一个由所有对象共享的类常量,目前来说有两种方法:
-
在类中声明一个枚举
-
使用static关键字在类中定义常量
//使用枚举的方式 class Bakery { private: enum{Months=12}; double costs[Months]; ... } //使用静态变量的方式 class Bakery { private: static const int Months = 12; double costs[Months]; ... }
关于上面提到的枚举方法,在使用时可能出现名称冲突的问题,解决的方案就是加上类的作用域