一、概述和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 | 《数字图像处理原理与实践(MATLAB版)》(未完待续)

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

  2. javascript有用小功能总结(未完待续)

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

  3. ASP.NET MVC 系列随笔汇总[未完待续……]

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

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

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

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

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

  6. virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)

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

  7. MVC丶 (未完待续······)

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

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

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

  9. [python]爬代理ip v2.0(未完待续)

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

  10. IOS之KVC和KVO(未完待续)

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

随机推荐

  1. 常见的php模式

    php中6种常见的设计模式 单例模式 观察者模式 策略模式 工厂模式 注册模式 适配器模式 单例模式 Db.php<?php /** * 单例模式 */ class Db { private s ...

  2. Merge Into 语句代替Insert/Update在Oracle中的应用实战

    动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...

  3. python 处理 https链接 socket报错 链接https

    // socket 链接 https 有问题 得去看看ssl文档 用法 import socketimport ssl def https_test(url): proto = "http& ...

  4. python3 互译无线短信接口

    #!/usr/local/bin/python#-*- coding:utf-8 -*-import http.clientimport urllibimport random host = &quo ...

  5. Web框架本质及第一个Django实例 Web框架

    Web框架本质及第一个Django实例   Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...

  6. python print格式化输出。

    python print格式化输出. 1. 打印字符串 print ("His name is %s"%("Aviad")) 效果: 2.打印整数 print ...

  7. leetcode105

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  8. pyqt5 -——介绍及和pycharm的环境搭建

    pyqt5简介: yQt5的类存在与如下模块当中: ● QtCore ● QtGui ● QtWidgets ● QtMultimedia ● QtBluetooth ● QtNetwork ● Qt ...

  9. 《Effective Java 第三版》新条目介绍

    版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...

  10. 下载安装 STS(Spring Tool Suite),推荐对应 Eclipse 版本号,适用于Windows32位(xp、2003)

    sts下载地址:https://spring.io/tools/sts/legacy 虽然sts内置了版本对应的eclipse,仍推荐使用当前环境下稳定使用的eclipse版本. Start 找到ec ...