Reading | 《C++ Primer Plus》(未完待续)
一、概述和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;
}
注意几点:
需要两个cin.get()。
cout的字符串拼接很简单。
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》(未完待续)的更多相关文章
- Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)
目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...
- javascript有用小功能总结(未完待续)
1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
- 关于DOM的一些总结(未完待续......)
DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...
- 我的SQL总结---未完待续
我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...
- virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)
virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...
- MVC丶 (未完待续······)
希望你看了此小随 可以实现自己的MVC框架 也祝所有的程序员身体健康一切安好 ...
- 一篇文章让Oracle程序猿学会MySql【未完待续】
一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...
- [python]爬代理ip v2.0(未完待续)
爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...
- IOS之KVC和KVO(未完待续)
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- 常见的php模式
php中6种常见的设计模式 单例模式 观察者模式 策略模式 工厂模式 注册模式 适配器模式 单例模式 Db.php<?php /** * 单例模式 */ class Db { private s ...
- Merge Into 语句代替Insert/Update在Oracle中的应用实战
动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...
- python 处理 https链接 socket报错 链接https
// socket 链接 https 有问题 得去看看ssl文档 用法 import socketimport ssl def https_test(url): proto = "http& ...
- python3 互译无线短信接口
#!/usr/local/bin/python#-*- coding:utf-8 -*-import http.clientimport urllibimport random host = &quo ...
- Web框架本质及第一个Django实例 Web框架
Web框架本质及第一个Django实例 Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...
- python print格式化输出。
python print格式化输出. 1. 打印字符串 print ("His name is %s"%("Aviad")) 效果: 2.打印整数 print ...
- leetcode105
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- pyqt5 -——介绍及和pycharm的环境搭建
pyqt5简介: yQt5的类存在与如下模块当中: ● QtCore ● QtGui ● QtWidgets ● QtMultimedia ● QtBluetooth ● QtNetwork ● Qt ...
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- 下载安装 STS(Spring Tool Suite),推荐对应 Eclipse 版本号,适用于Windows32位(xp、2003)
sts下载地址:https://spring.io/tools/sts/legacy 虽然sts内置了版本对应的eclipse,仍推荐使用当前环境下稳定使用的eclipse版本. Start 找到ec ...