1  最简单地说,类即使定义了一个新的类型和一个新的作用域。

2  基础

1  构造函数

构造函数一般应使用一个构造函数初始化列表,来初始化对象的数据成员。

Sales_item(): units_sold(0), revenue(0.0)  {};

2  成员函数

在类内部定义的函数默认为inline.

将关键字const加在形参表之后,就可以将成员函数声明为常量:

double avg_price() const;

const成员不能改变其所操作的对象的数据成员。const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。

习题12.1:

using namespace std;
class Person {
    private:
        string name;
        string address;
}

习题12.2:

using namespace std;
class Person {
    Persion(string &name, string &addr)
    {
    }
    private:
        string name;
        string address;
};

习题12.3:

using namespace std;
class Person {
    Persion(string &name, string &addr)
    {
    }
    private:
        string name;
        string address;
public:
string getName() const
{
return self.name;
}
string getAddr() const
{
return self.address;
}
};
返回名字和地址的操作不应该修改成员变量的值,所以应该指定成员函数为const。

习题12.4:

name和address为private实现数据隐藏, 函数getName() 和getAddr()为public提供接口,构造函数通常也为public.

3  数据抽象和封装

在C++中,使用访问标号(public, private, protected)来定义类的抽象接口和实施封装。

两个优点:

  • 避免类内部出现无意的,可能破坏对象状态的用户级错误;
  • 随时间推移可以根据需求改变或缺陷报告来完善类实现,而无需改变用户级代码。

习题12.5:

C++支持三种访问标号,public private protected

习题12.6:

class关键字定义的类,默认的访问权限为private,struct关键字定义的类,默认的访问权限是public。

习题12.7:

封装是一种将低层次的元素组合起来形成新的,高层次实体的技术。

封装隐藏了内部元素的实现细节。

4 使用类型别名来简化类

类可以定义自己的局部类型的名字。

class Screen {
public:
// interface member functions
typedef std::string::size_type index;
private:
std::string contents;
index cursor;
index height, width;
};

可以在类定义体内指定一个成员为inline,作为其声明的一部分,或者,也可以在类定义体外部的函数定义上指定inline。在声明和定义处指定inline都是合法的。

注意:inline成员函数的定义必须在调用该函数的每个源文件中是可见的,不在类体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中。

12.8:

class Sales_item {
    public:
        double avg_price() const;
        bool same_isbn(const Sales_item &rhs) const
        {
            return isbn == rhs.isbn;
        }
    private:
        std:string isbn;
        unsigned units_sold;
        double revenue;
};
inline double Sales_item :: avg_price() const
{
    if (units_sold) 
        return revenue/units_sold;
    else
        return 0;
}

其他的两种写法:

  • 将成员函数的定义写在类内部;
  • 在类内部进行成员函数的声明时,指定inline关键字。

习题12.9:

class Screen {
public:
// interface member functions
typedef std::string::size_type index;
Screen(index ht, index wt, const std::string &cntnts)
{
height = ht;
width = wt;
contents = cntnts;
}
private:
std::string contents;
index cursor;
index height, width;
};
												

细嚼慢咽C++primer(4)——类(1):构造函数,类型别名的更多相关文章

  1. 浩哥解析MyBatis源码(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...

  2. MyBatis源码解析(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...

  3. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  4. C++中 类的构造函数理解(一)

    C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...

  5. C++ Primer 与“类”有关的注意事项总结

    C++ 与"类"有关的注意事项总结(一) 1. 除了静态 static 数据成员外,数据成员不能在类体中被显式地初始化. 例如 : class First { int memi = ...

  6. scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  7. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  8. scala入门教程:scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  9. [转]c++类的构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

随机推荐

  1. Android进程管理

    1.进程按照优先级分为不同的等级FVSBE Foreground process前台进程:用户可看到进程里某个activity界面(可以获得焦点的) Visible process可见进程:用户仍可见 ...

  2. Javac的命令

    关于命令,还可以查看<Java 7程序设计>一书后面的附录A As per javac source docs, there are 4 kinds of options: standar ...

  3. django显示SQL语句

    django显示SQL语句 有时候我们使用模型查询数据,但是并不知道具体执行的SQL语句到底对不对.那么可以通过下面的方法打印出具体执行的SQL语句.这样有助于调试: queryset = MyMod ...

  4. Oracle数据库调优总结

    oracle采用物理读和逻辑读,第一次查询数据库采用的是物理读,以后如果使用相同的sql语句查询,那么它会采用逻辑读,直接从内存中读取数据. 采用执行计划查看执行顺序和耗时:一般查看object na ...

  5. [中英对照]How PCI Works | PCI工作原理

    How PCI Works | PCI工作原理 Your computer's components work together through a bus. Learn about the PCI ...

  6. MVC5 知识点记录

    http://blog.csdn.net/qinkeliangqin/article/details/27084639#t27 一.概述 MVC简介: •       模型(Model) “数据模型” ...

  7. IOS9网络请求报错:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

    今天下载Xcode7试了下,运行项目时报上面的错误,网上查了下原来iOS9引入了新特性App Transport Security (ATS).详情:App Transport Security (A ...

  8. Idea软件Vim插件问题

    人家说用webstorm是纯前端,用Idea是java+前端,好,那就用Idea,装上试试,全选所有插件安装,奇迹出现了,选中一行代码,backspace,删不了,我的天,好吧,复制粘贴的快捷键也不行 ...

  9. RabbitMQ入门教程系列

    https://blog.csdn.net/column/details/18247.html

  10. 小程序插入html代码

    转自:https://blog.csdn.net/BetterGG/article/details/81027291 一.首先,html 分 2 种情况: 1.我在做详情页开发的时候发现获取到的数据是 ...