C++ primer -- 第十章 对象和类
本文是在阅读《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 settot(){totalval = 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];
...
}
关于上面提到的枚举方法,在使用时可能出现名称冲突的问题,解决的方案就是加上类的作用域
评论