C++基础知识
参考:http://www.bccn.net/article/kfyy/cjj/ C++教程
variable
警告 声明而未初始化的变量包含随机值。由于变量所指向的内存还没有初始化,所以不知道该内存地址包含什么值。
全局变量和用static修饰声明的变量总是初始化为0。而所有其它变量在初始化或赋值之前包含随机值。
常量
常量是一种标识符,它的值在运行期间恒定不变。
C语言用 #define来定义常量(称为宏常量)。C++ 语言除了 #define外还可以用const来定义常量(称为const常量)。 const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)
类中的常量
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。不能在类声明中初始化const数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。
class A
{…
const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员
int array[SIZE]; // 错误,未知的SIZE
};
const数据成员的初始化只能在类构造函数的初始化表中进行,例如
class A
{…
A(int size); // 构造函数
const int SIZE ;
};
A::A(int size) : SIZE(size) // 构造函数的初始化表
{
…
}
A a(100); // 对象 a 的SIZE值为100
A b(200); // 对象 b 的SIZE值为200
怎样才能建立在整个类中都恒定的常量呢?别指望const数据成员了,应该用类中的枚举常量来实现。例如
class A
{…
enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。
数据类型
C++数据类型定义编译器在内存中存放信息的方式。在C++中,必须先声明变量类型再使用变量:int x1 = 1; 这样,编译器就可以进行类型检查,确保程序运行时一切顺利。数据类型使用不当会导致编译错误或警告,以便分析和纠正之后再运行。
typedef建立别名,使编译器在一个符号与另一符号间划上等号。
C++基本类型以及表示范围
C++操作符
操作符(operator)用于操作数据。
一元操作符
* 间接操作符 int x=*y;
& 地址操作符 int*
x=&y;
~ 位非 x &=~0x02;
! 逻辑非 if(!valid)
{...}
++ 递增操作符 x++(等于x=x+1;)
-- 递减操作符 x--;
指针数组:int * array[2],元素为指针的数组
数组指针:int (* array)[100],指向数组类型的指针
类和结构操作符
:: 范围解析 MyClass :: SomeFunction();
-> 间接成员 MyClass->
SomeFunction(); 左边必须为指针
· 直接成员 MyClass . SomeFunction(); 左边必须是对象或者结构体,一般是类对象
C++语言提供在一个函数的任意地方声明并使用一个变量的能力。
“::”是变量域运算符;::temp表示引用全局变量中的temp。
数组
任何C++固有数据类型都可以放进数组中。
C++一个强大的特性是能直接访问内存。由于这个特性,C++无法阻止你写入特定内存地址,即使这个地址是程序不让访问的。下列代码是合法的,但会导致程序或Windows崩溃:int array[5];array[5]=10;这是常见的错误,因为数组是以0为基数的,最大脚标应是4而不是5。如果重载数组末尾,则无法知道哪个内存被改写了,使结果难以预料,甚至会导致程序或Windows崩溃。这类问题很难诊断,因为受影响的内存通常要在很久以后才访问,这时才发生崩溃(让你莫名其中之妙)。所以写入数组时一定要小心。
数组规则
·数组是以0为基数。数组中的第一个元素为0,第二个元素为1,第三个元素为2,等等。
·数组长度应为编译常量。编译器在编译时必须知道为数组分配多少内存空间。不能用变量指定数组长度。所以下列代码不合法,会导致编译错误: int x = 10;int
myArray[x]; // compiler error here·
· 大数组从堆叠(heap)而不是堆栈(stack)中分配(详见稍后)。· 从堆叠分配的数组可以用变量指定数组长度。例如:
int x = 10;int* myArray = new int[x]; // this is OK
字符数组/程序结构……略
C++中的函数
函数是与主程序分开的码段。这些码段在程序中需要进行特定动作时调用(执行)。参数(parameter)是传递给函数的值,用于改变操作或指示操作程度。
函数的构成部分使用函数前,要先进行声明。函数声明或原型(prototype)告诉编译器函数所取的参数个数、每个参数的数据类型和函数返回值的数据类型。
返回类型 函数名 参数表
↓ ↓ ↓
int SomeFunction(int x, int y){
函数体→int z = (x * y); return z;
↑
返回语句
}
变量可以按数值、指针或引用传递给函数
函数设计(建议)
- 函数的功能要单一,不要设计多用途的函数。
- 函数体的规模要小,尽量控制在50行代码之内。
- 尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。
- 不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。
- 用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。
内存分配
①内存分配方式
内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
②常见的内存错误及其对策
http://www.bccn.net/Article/kfyy/cjj/jc/200512/2634.html