为什么学习C++:
1、为了弄懂android底层,以及NDK开发
2、增长视野
开发环境搭建:
对比开发工具VS2005和eclipse+cdt+MinGW,发现最新版的eclipse太强了,都自动集成了,编译运行和VS2005一样方便。
写个helloworld测试发现,在eclipse上,C代码可运行,但C++说没有找到libgcc_s_dw2-1.dll,将MinGW的bin目录加入到环境变量中,问题解决!
学习概要:
第一章
初窥输入/输出
C++的输入输出 ------------- 标准库<iostream> ---------- cin、cout、cerr、clog
类简介
引入头文件 系统-----<>, 自定义----""
#include <standard_header>
#include "my_file.h"
第二章
基本内置类型
C++标准规定了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。
boolean char wchar_t short int long float double long double
(1)表示整数、字符和布尔值的算术类型合称为。
(2)wchar_t 类型用于扩展字符集,比如汉字和日语。
字面值常量
(1)在字符、字符串字面值前加 L 就能够得到 wchar_t 类型的宽字符字面值。如: L'a'、L"a wide string literal"
(2)为了兼容 C 语言,C++ 中所有的字符串字面值都由编译器自动在末尾添加一个空字符。。
(3)两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。如
std::cout << "a multi-line "
"string literal " << std::endl;
(4)如果连接字符串字面值和宽字符串字面值,将会出现什么结果呢?其结果是!!!
(5)句尾“\”,就是把下行挪上来。
变量
变量的两种初始化:复制初始化和直接初始化
int ival(1024); // direct-initialization
int ival = 1024; // copy-initialization
声明与定义
extern int i; // 声明可多次;声明仅说明变量在其他地方定义,不会分配存储空间;
int i; // 定义只能一次;
通常把一个对象定义在它首次使用的地方是一个很好的办法。
Const标识符
connst修饰符----- 不可修改,定义时必须初始化,比如:
const std::string hi = "hello!"; // ok: initialized
const int i, j = 0; // error: i is uninitialized const
非 const 变量默认为 extern。要使 const 变量能够在其他的文件中访问,必须地指定它为 extern。比如:
extern const int bufSize = 1; //可被其他文件访问,其他文件中:extern const int bufSize;
const int bufSize = 1; //不能被其他文件访问
引用
在变量名前添加“&”符号来定义
每一种引用类型都“关联到”某一其他类型。但不能定义引用类型的引用。
如
int ival = 1024;
int &refVal = ival; // ok: refVal refers to ival
int &refVal2; // error: a reference must be initialized
int &refVal3 = 10; // error: initializer must be an object
引用仅是对象的一个别名
const 引用,指向const对象的引用
const int ival = 1024;
const int &refVal = ival; // ok: both reference and object are const
int &ref2 = ival; // error: non const reference to a const object
typedef 名字
定义类型同义词
typedef double wages; // wages is a synonym for double
typedef wages salary; // indirect synonym for double
typedef 通常被用于以下三种目的:
为了隐藏特定类型的实现,强调使用类型的目的。
简化复杂的类型定义,使其更易理解。
允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
枚举
枚举比常量的好处
说明了一组常量是相关的,并且可以给这组常量一些实用方法。定义一个:
// input is 0, output is 1, and append is 2
enum open_modes {input, output, append};
枚举的赋值操作:
Points pt3d = point3d; // ok: point3d is a Points enumerator
Points pt2w = 3; // error: pt2w initialized with int
pt2w = polygon; // error: polygon is not a Points enumerator
pt2w = pt3d; // ok: both are objects of Points enum type
注意把 3 赋给 Points 对象是非法的,即使 3 与一个 Points 枚举成员相关联。
类类型
定义类时,通常先定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。
定义类:
class Sales_item {
public: // operations on Sales_item objects will go here
private:
std::string isbn;
unsigned units_sold;
double revenue;
};
和java很不一样的是:class的花括号后还有“;”。
使用 struct 关键字
C++ 支持另一个关键字 ,它也可以定义类类型。struct 关键字是从 C 语言中继承过来的。
不同的是:第一个访问标号前的成员访问等级。class-----private ; struct--------public
编写头文件
头文件用于声明而非定义
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。但有三个例外:
头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数
如果 const 变量不是用常量表达式初始化,则该 const 变量应该在一个源文件中定义并初始化。应在头文件中为它添加 extern 声明,以使其能被多个文件共享。
预编译器
包含同一头文件不会引起该头文件定义的类和对象被多次定义,则通常为:。
避免多重包含
预处理器允许我们自定义变量。
预处理器变量 的名字在程序中必须是唯一的。任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。为了避免名字冲突,预处理器变量经常用全大写字母表示。
#define 指示接受一个名字并定义该名字为预处理器变量
#ifndef 指示检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现 #endif。如
#ifndef SALESITEM_H
#define SALESITEM_H // Definition of Sales_itemclass and related functions goes here
#endif
头文件应该含有保护符,即使这些头文件不会被其他头文件包含。编写头文件保护符并不困难,而且如果头文件被包含多次,它可以避免难以理解的编译错误