C++ 之要点总结
来源:互联网 发布:linux如何修改机器名 编辑:程序博客网 时间:2024/05/22 11:03
1.windows环境在运行程序后就自动关闭窗口问题。
我们可以让窗口一直打开知道按下ENTER键。解决方法是:在return语句后加上一行代码:cin.get();或者用systerm(”pause”);
2.头文件名新老标准:
c++旧式风格:以.h结尾 举例:iostream.h
c++新式风格 : 没有扩展名 举例:iostream
新式风格下,cout,cin的使用。1)std::cout<<”…..”;2)函数体内开头加上using namespace std;后面的代码就可以直接使用cout<<”…”;3用using声明只是所需的名称。例using std::cout;
3.
在C++中内置类型有:
整型:
①整数 int、short和long
②字符型 char和wchar_t
③布尔型 bool
整型可用修饰:unsigned
浮点:
float、double和long double
记住:string不是内置类型。
4.new 对象数组初始化
string *psa = new string[10]; //array of 10 empty stringsint *pia = new int[10]; //array of 10 uninitialized intsint *pia = new int[10](); //array of 10 empty ints
第一个数组是 string 类型,分配了保存对象的内存空间之后,将调用 string 类型的默认构造函数依次初始化数组中每个元素;第二个是申请具有内置类型的数组,分配了存储 10 个 int 对象的内存空间,但并没有初始化。
对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()
5.枚举类型
enum string{ x1, x2, x3=10, x4, x5, } x;
函数外部,x为0,函数内部x 为随机数
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
…
标识符[=整型常数],
} 枚举变量;
如果枚举没有初始化, 即省掉”=整型常数”时, 则从第一个标识符开始,
依次赋给标识符0, 1, 2, …。但当枚举中的某个成员赋值后, 其后的成员按依次加1的规则确定其值。
例如下列枚举说明后, x1, x2, x3, x4的值分别为0, 1, 2, 3。
enum string{x1, x2, x3, x4}x;
详细请点:C语言枚举类型详解
6. 变量地址转换
unsigned char *p1;unsigned long *p2;p1=(unsigned char *)0x801000;p2=(unsigned long *)0x810000;
p1=(unsigned char*)0x801000;
是给指针变量赋值,即把十六进制0x801000放到字符指针变量中,即指针变量p1的值就是0x801000
输出结果p1+5的值是801005,因为指针变量指向的值字符,加一表示指针向后移动一个字节,那么加5代表向后移动5个字节,所以输入801005
p5+5的值是801016,因为指针变量指向的长整形的,加一表示指针向后移动4个字节,那么加5代表向后移动20个字节,所以输入810014,(输出时十六进制)要是十进制就是810020了
地址加1,单位是类型长度。
cout输出字符变量的地址需要进行类型转换,cout char*类型的指针值就理解为串输出。
#include <iostream>using namespace std;int main(){ int m = 59; char *name = "yuting"; cout << &m << endl; cout << (void *)name << endl;}
7.全局变量,静态局部变量,局部变量空间的堆分配和栈分配
设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为 A B D C
C c;void main(){ A*pa=new A(); B b; static D d; delete pa;}
这道题主要考察的知识点是 :全局变量,静态局部变量,局部变量空间的堆分配和栈分配
其中全局变量和静态局部变量时从 静态存储区中划分的空间,
二者的区别在于作用域的不同,全局变量作用域大于静态局部变量(只用于声明它的函数中),
而之所以是先释放 D 再释放 C的原因是, 程序中首先调用的是 C的构造函数,然后调用的是 D 的构造函数,析构函数的调用与构造函数的调用顺序刚好相反。
局部变量A 是通过 new 从系统的堆空间中分配的,程序运行结束之后,系统是不会自动回收分配给它的空间的,需要程序员手动调用 delete 来释放。
局部变量 B 对象的空间来自于系统的栈空间,在该方法执行结束就会由系统自动通过调用析构方法将其空间释放。
之所以是 先 A 后 B 是因为,B 是在函数执行到 结尾 “}” 的时候才调用析构函数, 而语句 delete a ; 位于函数结尾 “}” 之前。
8 . sizeof(类),类占用内存大小
若char是一字节,int是4字节,指针类型是4字节,代码如下:
class CTest{ public: CTest():m_chData(‘\0’),m_nData(0) { } virtual void mem_fun(){} private: char m_chData; int m_nData; static char s_chData;};char CTest::s_chData=’\0’;
问:
(1)若按4字节对齐sizeof(CTest)的值是多少?
(2)若按1字节对齐sizeof(CTest)的值是多少?
请选择正确的答案。
12,9
解释:
1 先找有没有virtual 函数,有的话就要建立虚函数表,+4
2 static的成员变量属于类域被类所有实例所共享的,它不计入sizeof计算的空间 +0
3 什么成员函数或变量都没有的类,或者只有成员函数 +1
4 类中的普通函数或静态普通函数都存储在代码区中,不计入sizeof计算的空间
12= 4(虚表指针)+1(char )+3(对齐补位)+4(int)
9 = 4(虚表指针)+1(char )+4(int)
如果想用程序输出变量的地址,可以这样做:
printf("%p\n",&CTest::m_chData); //此处输出m_chData的内存地址。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。
sizeof(string)
使用标准C++中string类,必须要包含
#include <string> 头文件
string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。 sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()为12、32字节的库实现。
测试验证:
string str_test1; string str_test2 = "Hello World"; int value1, value2, value3; value1 = sizeof(str_test1); value2 = sizeof(str_test2); value3 = sizeof(string); cout<<"str_test1占 "<<value1<<" 个字节"<<endl; cout<<"str_test2占 "<<value2<<" 个字节"<<endl; cout<<"string占 "<<value3<<" 个字节"<<endl;
在win32系统,vs2010测试得到:
9. 时间复杂度与初始排序无关的算法
常见的几种排序算法复杂度如下:
方式: 平均 最坏 最好
插入 n^2 n^2 n
希尔 n^1.3 / /
冒泡 n^2 n^2 n
快速 nlogn n^2 nlogn
选择 n^2 n^2 n^2
堆排 nlogn nlogn nlogn
归并 nlogn nlogn nlogn
基数 d(n+r) d(n+r) d(n+r)
其中最好、最坏、平均三项复杂度全是一样的就是与初始排序无关的排序方法,也就是:
选择排序、堆排、归并、基数
10. 运算符优先级
百度百科-运算符优先级
11. ASCII码
在计算机中,所有的数据在存储和运算时都要使用二进制数表示。为了方便,每个字符与二进制相对应。得到承认的编码规则就是ASCII码。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(0~127)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。还有128个称为扩展ASCII码。
12.转义字符的表示
所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。例如 ‘\041’;即用八进制表示的字符“!”。一般而言,八进制前面以0开头,但这儿41前面的0可以去掉。C/C++规定不允许使用斜杠加10进制数来表示字符。’\x2f’表示用十六进制表示的转义字符“!”。
13. sizeof(指针)与sizeof(数组)
#include <stdio.h>#include <string.h>int main (int argc, char** argv){ char as[10]; char as2[10][20]; char * ps = as; char *pa[10]; char (*ppa)[10]; char *pc = "hello"; char pac[] = "hello"; /* as与ps是有本质区别的,ps仅仅是一个字符指针,而as则指代由10个char */ /* 组成的字符数组 */ printf("sizeof(as)=%d\n", sizeof(as)); //10 printf("sizeof(ps)=%d\n", sizeof(ps)); //4 /* 同理,as2[0]指代由20个char组成的字符数组 */ /* as2指代整个二维字符数组 */ printf("sizeof(as2[0])=%d\n", sizeof(as2[0])); //20 printf("sizeof(as2)=%d\n", sizeof(as2)); //200 /* pa是由10个字符指针组成的数组 */ /* *pa是这个数组中的第一个元素 */ printf("sizeof(pa)=%d\n", sizeof(pa)); //40 printf("sizeof(*pa)=%d\n", sizeof(*pa)); //4 /* ppa是一个指向由10个char组成的数组的指针 */ /* (*ppa)才是指代整个数组 */ printf("sizeof(ppa)=%d\n", sizeof(ppa)); // ** 4 printf("sizeof(*ppa)=%d\n", sizeof(*ppa));//10 /* pc只是一个字符指针, (*pc)是一个字符 */ printf("sizeof(pc)=%d\n", sizeof(pc)); // 4 printf("sizeof(*pc)=%d\n", sizeof(*pc)); //1 /* pac则是一个字符数组, 注意它的大小是6,而不是5,因为后面会自动加一个'\0' */ printf("sizeof(pac)=%d\n", sizeof(pac));//6}
13 二维动态数组vector
对于vector<vector<int> > array;
其表示的是二维动态数组。
如何得到数组的维数?我们知道一维是行,二维是列
所以我们可以这样:
int rows = array.size();int cols = array[0].size();
创建二维动态数组方法:
int row=2,col=4; vector<vector<int> > v(row);//v为容器的容器,大小为2. for(int i=0; i<row; i++) v[i].resize(col);//里层容器大小设置为4
二维动态数组赋值方法:
for(int i=0; i<row; i++)//初始化元素的值 for(int j=0; j<col; j++) v[i][j]=i*col+j+1;
初始化二维数组vector<vector <int> > ivec(m ,vector<int>(n,0)); //m*n的二维vector,所有元素为0
- C语言要点总结
- C++ 之要点总结
- C语言要点总结(一)
- C语言要点总结(二)...
- C语言要点总结(二)...
- Objective C运行时(runtime)要点总结
- 自学考试应试技巧总结之十要点
- 学习笔记之KVC,KVO要点总结
- Java常用类之要点总结
- 【C/C++】C++ 标准库函数string类型要点总结
- 【JNI探索之路系列】之七:JNI要点总结
- C/C++ 学习要点总结(未整理)
- 《Understanding and Using C Pointers》要点先睹为快 系统总结
- 黑马程序员——c语言要点总结
- 易被遗忘的C/C++要点总结
- EDM邮件之移动端设计要点总结
- C++复习要点总结之二——函数
- c++复习要点总结之三 ——构造函数
- 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
- Caffe中SyncedMemory类阅读
- Android studio introduction No.2 -- basic setting and build a helloword project
- Windows环境下Android Studio v1.0安装教程、百度云下载Android Studio
- Shodan完全手册部分翻译(2)
- C++ 之要点总结
- 不满与抱怨
- 【english】 你好,2016
- POJ-3984-迷宫问题
- [Demo][Add HTML+CSS+JQuery]
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 从头认识java-15.7 Map(4)-介绍HashMap的工作原理-hash碰撞(经常作为面试题)
- QT读取网络图片
- 亲测:ThinkPHP 调用微信JS-SDK 开发详解