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
cin >> var; 会将最后的空格或'\n'留在输入流中
const关键词是all-or-nothing的,如果对某个类型的一个数组参数使用了const,那么对这个类型的其他所有数组参数都必须使用const,例如:
用new创建的变量叫做dynamic variable,内存中叫做freestore的区域会被用来分配dynamic变量;如果没有足够的空间进行分配,new会抛出一个exception,如果没有被catch的话则会终止程序。如果类型是class则默认的constructor会被调用。delete释放new所占用的空间
如果有多个指针指向同一个位置,则当一个指针被delete时,其他的指针会被成undefined pointer,叫做dangling pointer。
动态数组使用new进行声明,用delete []进行释放。如果只使用delete不会报错,但结果是未定义的。当一个指针被用new分配了数组时,不要再将其他的指针值赋给它,因为这样在delete时会confuse系统
使用二维(多维)动态数组时,要先创建一个类型为指针的一维数组,再对这个数组中的每个元素创建数组。在释放空间时,要对每个new进行delete
C++的函数定义可以使用default argument。如果一部分parameter提供了default value而一部分没有,则必须将有default value的放在参数列表的最后。在调用时,argument会被依次赋给没有default value的parameter,然后是有default value的。如
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,例如:
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的
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),目的通常是避免命名冲突
相关文章推荐
- 第8周项目2 建立链串的算法库
- c++boost中的asio介绍
- 二叉搜索树(Binary Search Tree)--C语言描述(转)
- C++指针和数组:字符和字符串、字符数组
- 第8周项目1 建立顺序串的算法库
- [C++] Abstract Factory Pattern 实作
- Direct2D 1.1 开发笔记 特效篇(五) 径向模糊
- C++中的关键字用法---typename
- C++中的关键字用法--- explicit
- c语言表白程序代码
- ios入门攻略 07篇 C语言基础【循环结构之for语句,打印九九乘法表】
- C++运算符重载
- c++ cout格式化输出函数详解
- STM32 C++ 底层封装的尝试[1]
- iOS开发---C语言简介
- ios入门攻略 06篇 C语言基础【循环结构之while ,do-while语句】
- DBT3514W The db2prereqcheck utility failed to find the following 32-bit library file: "libstdc++.so
- 带你玩转Visual Studio——结局汇总
- 【C++】内联函数,inline
- 逐渐有意识地适当远离Windows环境编程和C语言