写点什么

C++ primer -- 第十章 对象和类

用户头像
Dreamer
关注
发布于: 2020 年 11 月 02 日
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

  1. 访问控制

关键字 public 和 private 实现。类对象的程序可以直接访问公有部分,但是只能通过公有成员函数私有部分


  1. 控制对成员的访问:公有还是私有

不必声明关键字 private,因为这是类对象的默认访问控制。


  1. 对于类中定义的的函数都自动称为 inline 函数,如果愿意也可以类外定义成员函数,并使其成为 inline 函数。确保 inline 函数可用的最简单的方法是,将 inline 定义放在定义累的头文件中


  1. 类对象有自己的存储空间用来存储内部变量和类成员;但同一个类的对象共享同一组类方法,即每个方法只有一个副本


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];

...

}

关于上面提到的枚举方法,在使用时可能出现名称冲突的问题,解决的方案就是加上类的作用域


用户头像

Dreamer

关注

一个不想做搜索的NLPer不是一个好的CVer 2019.12.18 加入

还未添加个人简介

评论

发布
暂无评论
C++ primer -- 第十章 对象和类