Reading | 《C++ Primer Plus》(未完待续)

时间:2022-06-02 15:13:04

一、概述和C++简史

C++融合了3种编程方式:

  • C语言代表的过程性语言;

  • 类代表的面向对象语言;

  • C++模板支持的泛型编程。

1、早期语言的问题

汇编语言是低级语言,最大的问题是:当需要把汇编程序移植到另一种计算机上时,必须重新写汇编程序

早期的程序语言(如FORTRAN和BASIN),当规模较大时,执行路径会很混乱,被称为意大利面条式编程。
为了解决这一问题,我们引入了结构化编程Structured Programming

C语言具有结构化编程的特性,比如分支结构、判断结构等。并且,C语言鼓励程序员开发程序单元(函数)来简化各个任务模块。这是自上而下(top-down)的设计思想。

但是,C语言仍然是面向过程的(procedural),这意味着C语言仍然强调算法。
因此,在编写大型程序时,C语言仍然不够简单。

2、面向对象编程OOP

为了应对这一挑战,我们引入面向对象编程Object-Oriented Programming
OOP的思想:设计与问题的本质特性相对应的数据类型,强调的是数据而不是算法

在C++中:

  • 类是一种规范,它描述了这种新型数据格式。

    类准确描述了程序要处理的东西,以及可执行操作。

  • 对象是根据这种规范构造的特定的数据结构。

首先设计类,其次再设计使用这些类的对象的程序。
整个设计过程从低级的类到高级的程序,因此是自下而上的(bottom-up)

OOP有助于:减少代码;通过信息隐藏保护数据等等。
并且,我们往往有许多现成的类库,方便我们快速修改、应用经过仔细测试的代码。

3、泛型编程

泛型:与数据类型无关的代码。

例如:对不同类型的数据进行排序,通常需要对每一种类型创建各自独立的排序函数。
而泛型编程需要对语言进行拓展,允许只写一个泛型排序函数,而适用于各种实际类型。

二、入门

C++对大小写敏感!

例程:

// myfirst.cpp -- displays a message

# include <iostream>
int main()
{
    using namespace std; //make definitions visible
    cout << "Hello world!";
    cout << endl; // start a new line
    cout << "world again!" << endl;

    cin.get(); // 避免秒退
    return 0;
}

1、头文件

C++支持printf()、scanf()等标准C输入输出函数,只需要包含stdio.h文件。我们用C++的输入工具,它们有许多改进之处。

  • 我们知道,函数头包括函数返回类型、函数名和形参列表。main函数为什么需要函数头呢?
    因为main函数被启动代码调用,而启动代码是由编译器添加到程序中的。是程序和操作系统之间的桥梁。
    即,该函数头描述的是main函数和操作系统之间的接口。

  • 不接受任何参数时,可以使用以下变体:
int main(void)
  • 不写return时,如果编译器到达main函数末尾没有遇到返回语句,则默认为return 0。
    只适用于main函数!

  • 在程序中可以同时使用C和C++的注释风格。C注释包括/*...*/,可以跨越多行,比较方便。

  • 仍可以使用C以.h结尾的头文件,但前面要加上c。并且新版C++的头文件不含后缀(作用后述)。
    如math.h变成了cmath。

2、名称空间

  • 我们用的是iostream和cout函数。以下讲解原因。
  • 名称空间支持是一项C++特性,有助于多个代码组合和组织程序。
    比如,两个代码含有同名函数wanda()。
    此时,Microflop公司可以将其定义在Microflop名称空间,调用时全称为Microflop::wanda();
    同理,Piscine公司的wanda()则表示为Piscine::wanda()。
  • std是标准库函数使用的命名空间。因此,一般做法应该是添加 iostream.h,使用std::cout函数。
    但是,显然std::cout太繁琐了,基本没有人采取这种做法。
  • 为此,我们引入第二行:using编译指令,用于指定名称空间
    意思是,调用的是std名称空间中的iostream文件。这样,我们就可以省略cout的前缀了。
  • 但是这样做在大型程序中仍不保险。最好的做法是指明具体的函数:
using std::cout;
using std::endl;
using std::cin

3、cout输出

输出语句:

cout << "world again!" << endl;
  • 双引号括起来;

  • <<表示字符串发送给cout对象。cout对象可以显示字符串、数字等。

  • 输出是一个流,即从程序流出的一系列字符。cout的属性中包括一个插入运算符<<,可以将右侧消息插入流。

  • endl是一个特殊的C++控制符,表示屏幕光标移至下一行开头。endl也是iostream中定义的,位于名称空间std中。
    C++保留了换行符\n,可以简化代码。但如果只是需要一个空行,endl不需要双引号。

  • cout相当智能,既能处理字符串,又能处理整数,还能识别变量。本质上是因为C++面向对象特性。反观C的printf就不行。

4、C++语句

在C中,所有变量的声明通常位于函数或过程的开始位置,但C++没有这种限制。

在C和C++中,可以连续赋值:

    int a;
    int b;
    int c;
    a = b = c = 1; // 赋值从右向左

再看一个例程:

// getinfo.cpp -- input and output
# include <iostream>

int main()
{
    using namespace std; //make definitions visible

    int carrots;

    cout << "How many carrots do you have?" << endl;
    cin >> carrots;
    cin.get(); // 吸收输入完毕的Enter
    cout << "Give you two more.";
    carrots += 2;
    cout << "Now you have " << carrots << " carrots." << endl;

    cin.get(); // 避免秒退

    return 0;
}

注意几点:

  1. 需要两个cin.get()。

  2. cout的字符串拼接很简单。

  3. C++中标记间的换行符和空格是可互换的。因此如果输出很长,可以这么写:

    cout << "Now you have "
        << carrots
        << " carrots."
        << endl;

5、函数

在C++中,函数调用必须包括括号,即使没有参数。

有一些函数不返回值,函数原型可以写为:

void test(double)

由于不返回值,因此不要写在赋值语句或其他表达式中。

通常我们需要自定义函数。以下是例程:

// ourfunc.cpp -- defining my own function
# include <iostream>
void Ryan(int); // 函数原型要先写,注意是int不是int n

int main()
{
    using namespace std; //make definitions visible

    cout << "input your score: ";

    int count;
    cin >> count;
    cin.get(); // 除了回车符,其余都被提取了。现在要把enter解决掉,否则会闪退

    Ryan(count);

    cout << "Well done!" << endl;

    cin.get(); // 避免秒退
    return 0;
}

void Ryan(int n) // 没有分号,被编译器视为函数头
{
    using namespace std; //需要再次声明
    cout << "Your score is " << n << "!" << endl;
}

注意到,由于Ryan程序也用到了cout函数,因此也需要std名称空间。为了简化代码,可以放在开头:

// ourfunc.cpp -- defining my own function
# include <iostream>
using namespace std;
void Ryan(int);

带返回值的例程:

// convert.cpp -- converts stone to pounds
# include <iostream>
int stonetolb(int);

int main()
{
    using namespace std;

    int stone;
    cout << "Enter the weight in stone: ";
    cin >> stone;
    cin.get();

    int pound = stonetolb(stone); // 简洁的定义方式

    cout << stone << " stone = ";
    cout << pound << " pounds." << endl;

    cin.get(); // 避免秒退
    return 0;
}

int stonetolb(int sts)
{
    return 14 * sts; // 简洁的返回方式
}

还有更简单的写法,不需要定义pound:

cout << stone << " stone = "<< stonetolb(stone) << " pounds." << endl;

Reading | 《C++ Primer Plus》(未完待续)的更多相关文章

  1. Reading &vert; 《数字图像处理原理与实践(MATLAB版)》(未完待续)

    目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...

  2. javascript有用小功能总结&lpar;未完待续&rpar;

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  3. ASP&period;NET MVC 系列随笔汇总&lbrack;未完待续……&rsqb;

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  4. 关于DOM的一些总结(未完待续&period;&period;&period;&period;&period;&period;)

    DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...

  5. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  6. virtualbox搭建ubuntu server nginx&plus;mysql&plus;tomcat web服务器1 &lpar;未完待续&rpar;

    virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...

  7. MVC丶 &lpar;未完待续&&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi;&rpar;

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

  8. 一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

  9. &lbrack;python&rsqb;爬代理ip v2&period;0&lpar;未完待续)

    爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...

  10. IOS之KVC和KVO&lpar;未完待续&rpar;

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. 手动安装配置mongodb

    2.1查看当前操作系统版本 2.2下载mongodb安装包 我的下载路径:http://www.mongodb.org/downloads 注意这里要下载和操作系统匹配的版本,因为我的系统是32位的, ...

  2. Google

    1. Google Play: Google Play是谷歌官方的的应用市场, Google Play 服务通常会在 Android 装置上自动更新. http://baike.baidu.com/l ...

  3. 作业三--Linux内核分析

    一.Linux内核源码 arch目录支持不同CPU的源代码,是内核源码中比较大的文件. fs文件系统Linux内核的源码放在kernel目录中. 二.构造一个简单的Linux系统MenuOS 三.使用 ...

  4. Andorid-Fragment生命周期

    官网帮助文档链接: http://developer.android.com/guide/components/fragments.html Fragment的生命周期: Fragment与Activ ...

  5. Xshell异常断开

    这可能是由于 SSH 超时断开连接 导致的!可以这样做...修改/etc/ssh/sshd_config文件,找到 ClientAliveInterval 0和ClientAliveCountMax ...

  6. codeforces 652D Nested Segments 离散化&plus;树状数组

    题意:给你若干个区间,询问每个区间包含几个其它区间 分析:区间范围比较大,然后离散化,按右端点排序,每次更新树状数组中的区间左端点,查询区间和 注:(都是套路) #include<cstdio& ...

  7. CentOS的Redis内存分配策略配置

    安装了一主两从节点,启动之后发现有一个警告: 大概是说overcommit_memory设置成了0,在低内存环境下后台保存可能会失败,设置成1重启可解决. 然后,不太懂这个配置的含义,google一把 ...

  8. C&num; Attribute(中)——Attribute本质论

      小序:                   上篇里,我们把Attribute“粘”在类的成员方法上show了一把,让Attribute跟大家混了个脸儿熟.中篇里,我们将探讨“究竟什么是Attrib ...

  9. directUI

    MFC界面开发中,习惯了使用控件,亦或者是自绘制控件来美化界面,但操作起来繁琐,还不太美观.DirectUI的出现,对于界面开发,给了我们一个新的选择,目前很多公司使用了该技术对其产品进行了美化,效果 ...

  10. Asp&period;net mvc 知多少(七)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...