为什么学习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 longdouble
(1)表示整数、字符和布尔值的算术类型合称为整型。
(2)wchar_t类型用于扩展字符集,比如汉字和日语。
字面值常量
(1)在字符、字符串字面值前加L就能够得到wchar_t类型的宽字符字面值。如:L'a'、L"awidestringliteral"
(2)为了兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。。
(3)两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。如
std::cout<<"amulti-line"
"stringliteral"<<std::endl;
(4)如果连接字符串字面值和宽字符串字面值,将会出现什么结果呢?其结果是未定义的!!!
(5)句尾“\”,就是把下行挪上来。
变量
变量的两种初始化:复制初始化和直接初始化
intival(1024);//direct-initialization
intival=1024;//copy-initialization
声明与定义
externinti;//声明可多次;声明仅说明变量在其他地方定义,不会分配存储空间;
inti;//定义只能一次;
通常把一个对象定义在它首次使用的地方是一个很好的办法。
Const标识符
connst修饰符-----不可修改,定义时必须初始化,比如:
conststd::stringhi="hello!";//ok:initialized
constinti,j=0;//error:iisuninitializedconst
非const变量默认为extern。要使const变量能够在其他的文件中访问,必须地指定它为extern。比如:
externconstintbufSize=1;//可被其他文件访问,其他文件中:externconstintbufSize;
constintbufSize=1;//不能被其他文件访问
引用
在变量名前添加“&”符号来定义
每一种引用类型都“关联到”某一其他类型。但不能定义引用类型的引用。
如
intival=1024;
int&refVal=ival;//ok:refValreferstoival
int&refVal2;//error:areferencemustbeinitialized
int&refVal3=10;//error:initializermustbeanobject
引用仅是对象的一个别名
const引用,指向const对象的引用
constintival=1024;
constint&refVal=ival;//ok:bothreferenceandobjectareconst
int&ref2=ival;//error:nonconstreferencetoaconstobject
typedef名字
定义类型同义词
typedefdoublewages;//wagesisasynonymfordouble
typedefwagessalary;//indirectsynonymfordouble
typedef通常被用于以下三种目的:
为了隐藏特定类型的实现,强调使用类型的目的。
简化复杂的类型定义,使其更易理解。
允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
枚举
枚举比常量的好处
说明了一组常量是相关的,并且可以给这组常量一些实用方法。定义一个:
//inputis0,outputis1,andappendis2
enumopen_modes{input,output,append};
枚举的赋值操作:
Pointspt3d=point3d;//ok:point3disaPointsenumerator
Pointspt2w=3;//error:pt2winitializedwithint
pt2w=polygon;//error:polygonisnotaPointsenumerator
pt2w=pt3d;//ok:bothareobjectsofPointsenumtype
注意把3赋给Points对象是非法的,即使3与一个Points枚举成员相关联。
类类型
定义类时,通常先定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。
定义类:
classSales_item{
public: //operationsonSales_itemobjectswillgohere
private:
std::stringisbn;
unsignedunits_sold;
doublerevenue;
};
和java很不一样的是:class的花括号后还有“;”。
使用struct关键字
C++支持另一个关键字struct,它也可以定义类类型。struct关键字是从C语言中继承过来的。
不同的是:第一个访问标号前的成员访问等级。class-----private;struct--------public
编写头文件
头文件用于声明而非定义
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。但有三个例外:
头文件可以定义类、值在编译时就已知道的const对象和inline函数
如果const变量不是用常量表达式初始化,则该const变量应该在一个源文件中定义并初始化。应在头文件中为它添加extern声明,以使其能被多个文件共享。
预编译器
包含同一头文件不会引起该头文件定义的类和对象被多次定义,则通常为:头文件保护符。
避免多重包含
预处理器允许我们自定义变量。
预处理器变量的名字在程序中必须是唯一的。任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。为了避免名字冲突,预处理器变量经常用全大写字母表示。
#define指示接受一个名字并定义该名字为预处理器变量
#ifndef指示检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现#endif。如
#ifndefSALESITEM_H
#defineSALESITEM_H //DefinitionofSales_itemclassandrelatedfunctionsgoeshere
#endif
头文件应该含有保护符,即使这些头文件不会被其他头文件包含。编写头文件保护符并不困难,而且如果头文件被包含多次,它可以避免难以理解的编译错误