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;

 ↑

返回语句 

变量可以按数值、指针或引用传递给函数

函数设计(建议)

  1. 函数的功能要单一,不要设计多用途的函数。
  2. 函数体的规模要小,尽量控制在50行代码之内。
  3. 尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。
  4. 不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。
  5. 用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。

内存分配

①内存分配方式

内存分配方式有三种:

(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

②常见的内存错误及其对策

http://www.bccn.net/Article/kfyy/cjj/jc/200512/2634.html

 

posted @ 2012-06-12 18:31  七天的空白  阅读(824)  评论(1编辑  收藏  举报