您的位置:首页 > 编程语言 > C语言/C++

C++基础

2015-10-30 09:06 309 查看
type cast:static_cast<double>(9)

lvalue原本是指表达式左边的对象,但后来出现了const的变量,它也是lvalue,但不能出现在表达式左边因为它不能被更改。modifiable lvalue值能被改变的lvalue,const的变量不属于这一类。rvalue是任何有值的表达式,但不能对它进行赋值

overload function只能通过不同数量或类型的formal parameter来实现,而不能通过返回值类型的不同来实现

void类型的函数可以通过return来终止

call-by-reference的函数parameter只能是一个变量,而不能是常量或表达式。一个函数的parameter可以混合call-by-value和call-by-reference

stream parameter只能call-by-reference,不能是call-by-value

#define NDEBUG		// include this to disable assert
#include <cassert>
assert(bool expression);	// when the expression is false, program will abort


enum myType {ONE, TWO = 10, THREE, FOUR = -1, FIVE};	// ONE == 0, THREE == 11, FIVE = 0
有">>"符号的表达式既是一个行为,又是一个boolean结果

cin >> var; 会将最后的空格或'\n'留在输入流中

const关键词是all-or-nothing的,如果对某个类型的一个数组参数使用了const,那么对这个类型的其他所有数组参数都必须使用const,例如:

void average(int a[], int size);
void show_diff(const int a[], int size)
{
...
average(a, size);	// 编译时会产生error或warning,因为average可能改变数组a。需要把average定义为(const int a[], int size)
...
}


用new创建的变量叫做dynamic variable,内存中叫做freestore的区域会被用来分配dynamic变量;如果没有足够的空间进行分配,new会抛出一个exception,如果没有被catch的话则会终止程序。如果类型是class则默认的constructor会被调用。delete释放new所占用的空间

如果有多个指针指向同一个位置,则当一个指针被delete时,其他的指针会被成undefined pointer,叫做dangling pointer。

int* p1, p2;  // p1是指针,p2是int型变量


动态数组使用new进行声明,用delete []进行释放。如果只使用delete不会报错,但结果是未定义的。当一个指针被用new分配了数组时,不要再将其他的指针值赋给它,因为这样在delete时会confuse系统

double *p;
int a = 10;
p = new double[a];
...
delete [] p;


使用二维(多维)动态数组时,要先创建一个类型为指针的一维数组,再对这个数组中的每个元素创建数组。在释放空间时,要对每个new进行delete

typedef int* intArrayPtr;
int n, m, i;
n = 10;
m = 5;
intArrayPtr *a = new IntArrayPrt
;
for(i = 0; i < n; i++)
a[i] = new intArrayPtr[m];
...
for(i = 0; i < n; i++)
delete a[i];
delete [] a;


C++的函数定义可以使用default argument。如果一部分parameter提供了default value而一部分没有,则必须将有default value的放在参数列表的最后。在调用时,argument会被依次赋给没有default value的parameter,然后是有default value的。如

void default_val(int arg1, int arg2, int arg3 = -3, int arg4 = -4)
{
cout << arg1 << ' ' << arg2 << ' ' << arg3 << ' ' << arg4 << end;
}

default_val(5, 6);	// 5 6 -3 -4
default_val(6, 7, 8);	// 6 7 8 -4


new和malloc的区别:

1. new是一个operator,malloc是一个函数

2. malloc获得的内存时未初始化的,释放空间需要使用free;而new会通过调用constructor来进行初始化(如果是object,如果是普通变量如int也会被初始化),并且不需要手动声明需要的空间大小和进行类型转换,释放空间使用delete,它会自动调用destructor

3. new返回创建的数据,malloc返回void *。如果没有足够的空间malloc会返回NULL,而new会throw exception

4. new的内存是从free store获得的,而malloc是从heap获得的



inline function和macro都是为了减小function call的overhead,tradeoff是增加了程序的大小。他们的主要区别是:

1. inline function是通过compiler进行处理的,而macro是由preprocessor处理的

2. macro只是进行简单的文字替换;inline function与普通function的区别在于当compiler遇到对inline function的调用时,它会写下一个compiled function definition的副本(普通的函数会产生一个function call)

通常只有在进行简单替换时才使用macro,因为它很容易产生bug,例如:

#define square(x) (x) * (x)
#define foo(x, y) x += 2; y += 2;
...
int val = 1;
int a = square(++val);	// wrong, result is (++x) * (++x)
if(val == 2)
foo(a, val);		// y += 2 will always be executed because there is no "{}"


static关键词的用法:

1. 在函数中:表示一个变量在初始化之后,在内存中一直存在到程序结束。在这种情况下,这个变量只能被初始化一次

2. 在class的定义中:一个class中的普通变量是instance-by-instance的,也就是说对于class的每一个object,这个变量可以有不同的值。但对static member variable来说,所有属于同一个class的object都有同样的值,甚至可以不要求object存在。可以用来统计一个class被实例化了多少次,并且最好通过class名来refer这个变量。static
class member不能在class内部初始化,同时它也不能在header file中被初始化,要在.cpp中进行初始化

class也可以用static member function,它们不需要class被实例化,并且也要通过class名进行调用。static member variable只能对static member进行操作,因为它们不属于某个特定的实例。由于static member function与object无关,所以在调用它时没有this指针,同时它也不能是virtual/const/volatile的

class User {
public:
User() : id(User::next_id++) {}
static int get_next_id() {
return next_id + 1;
}
private:
int id;
static int next_id;
};
int User::next_id = 0;

cout << "next id is " << User::get_next_id() << endl;
3. 在一个file中将一个变量声明为static的表示同一个project中其他file中的代码不能访问这个变量,只有当前这一个file能访问这个变量(也就是说将这个变量的scope/visibility限制在这个file中,有internal linkage),目的通常是避免命名冲突
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: