当前位置:文档之家› (完整版)C++学习笔记

(完整版)C++学习笔记

endl换行符,也是std成员函数4).io流运算cout控制台输出—屏幕上终端窗口,带缓冲<<插入运算符cin控制台输入—键盘>>提取运算符5).名字空间Std:标准c++库所提供一切函数、对象、类型都隶属于std名字空间。

::-作用域限定符---名字空间“的”某个对象。

+= -=名字冲突:看作用域。

同一作用域不可使用相同名字。

----解决方法:成员前加名字空间名,中间::3.名字空间namespace 名字空间名{名字空间成员1;名字空间成员2;//名字空间成员可以是变量、函数、类型}名字空间名::名字空间成员1名字空间合并:同一个名字空间可以分别书写在不同的namespace子句中,只要它们的名字相同,仍然会被编译器识别为同一个名字空间。

Namespace名字空间名{名字空间成员1;}namespace名字空间名{名字空间成员2;}名字空间成员的声明和定义可以分开写,但是定义部分需要借助作用域限定符“::”指明所定义的成员隶属于哪个名字空间。

名字空间指令:using namespace名字空间名;名字空间指令以后的代码,对名字空间中的所有成员可见,可以直接引用,无需作用域限定符。

使用时要注意不要引入新的名字冲突。

名字空间声明:using名字空间名::名字空间成员;名字空间声明用于将名字空间中的特定标识符引入当前作用域,可以省略作用域限定符,直接引用之。

使用时注意不要因此引入新的名字冲突。

无名名字空间:不隶属于任何名字空间的标识符,编译器就将其缺省地放入无名名字空间。

对于无名名字空间中的成员,可以直接使用“::”进行访问。

名字空间允许多层嵌套,访问时需要逐层分解。

可利用名字空间别名简化名字空间嵌套路径的书写形式。

Using只能看里面一层。

4.结构、联合和枚举1)所有的类型关键字在声明变量时都可以省略。

struct Date{ //Date结构名int year; //成员变量(成员表列)(类型说明符成员名)int month;int day;void show(void)//成员函数{}};Int main(void){ //全局变量Date d = {2016,8,2},*e = &d;//e是指向d的指针d.show(); //“.”直接成员访问运算符e->show (); //“->”间接成员访问运算符return 0;}struct Date d = {2016,8,2};//C/C++Date d = {2016,8,2};//C++ //类型关键字省略2)C++中结构体可以包含函数(一个int四个字节,函数不放变量中,放代码区)成员函数的调用,前面要写“.”“->”定义结构体时不能同时初始化!3)C++中增加了匿名联合。

借用了联合语法形式,定义变量的内存布局。

4)C++中枚举是一种整型的数据类型,其取值范围也是类型的一部分,因此在和整型进行类型转换时会受到约束。

5.字符串子面值:“Hello,World!”字符指针:“char const* p = 字符串”;字符数组:char ca[] = “字符串“;string对象:string s = “字符串“;简单、安全、一致。

栈是一种数据结构。

栈可以用来存放一组数字,这些数字按照时间先后被放到栈里,从栈里获得数字的时候一定是最后一个放进去的数字,这个规则叫做后进先出。

实现栈的时候使用push函数向里面放数字,使用pop函数从栈里获得数字。

实现栈的时候最前面数字所在存储区位置固定,最后面数字所在存储区位置不断变化。

字符串比较函数strcmp(const char[ ],const char[ ]);如果str1等于str2,函数值为0;大于,正整数;小于,负整数。

c.size:字符串长度sizeof(c):求c这个字符串的字节大小(跟字符串长度无关)——string里存的是字符串地址。

所占内存为动态内存,在堆空间里。

#include<string> //C++的string类型#include<string.h> //和下面的等价,标准C语言的字符串函数:strcpy/strcat#include<cstring> //6.布尔类型:bool逻辑值:真和假True/false1/0任何类型都可以隐式转换为布尔类型,(bool b;b = 1234;)其转换规则就是只要源类型数据的值为0就是假(false),否则就是真(true)。

在C++中关系表达式和逻辑表达式的值的类型是bool而不是int7.操作符别名(unimportant)8.重载1)同一个作用域中,函数名相同,参数表不同的函数,构成重载关系。

2)在调用具有重载关系的函数时,编译器会根据所提供的实参表,选择与之相适应的重载版本,这个过程叫做重载解析。

void foo(void);void foo(int n);void foo(int* p);char const* foo(int n,double d);char const* foo(double d,int n);char const* foo(double x,int y);//非法,参数名与重载无关int foo(void);//非法,返回类型与重载无关【调用时重载解析】3)直接调用函数,编译器是在编译函数调用语句时进行重载解析。

通过函数指针调用函数,编译器是在编译对函数指针初始化或赋值的语句时进行重载解析。

4)只有同一作用域中的同名函数才涉及重载问题,不同作用域中的同名函数遵循名字隐藏原则。

同时,需要注意名字空间指令和名字空间声明对可见性以及作用域的影响。

5)重载是通过c++换名实现的。

C++编译器在编译函数时,会将其参数表的类型信息合并到函数名中,生成一个新的函数名。

参数表不同的重载版本,在二进制目标模块(.o文件)中使用的是被编译器置换以后的函数名。

C++换名在C和C++混合编程时会带来问题。

C++3pm二、类和对象1.什么是对象?万物皆对象。

2.如何描述对象?通过对象的属性和行为加以描述。

3.什么叫面向对象?现实世界描述虚拟世界真是对象属性/行为逻辑对象类4.什么是类?类就是一种用于描述对象属性和行为的数据类型。

Int/float/char,太过单一数组,类型不够丰富,表现力差结构,缺乏函数语法,无法表现行为类,可以表示一到多个属性(变量),其类型可以相同也可以不同,同时提供对多种不同行为(函数)的描述。

狗属性:犬种、犬龄、体重、毛色行为:进食、睡眠、玩耍5.类的定义与实例化1)类的一般形式class/struct 类名:继承方式基类{ //class clock:public QWidget访问控制限定符://public,private,protect类型成员变量名;返回类型成员函数名(形参表)常属性异常说明{函数体}类名(形参表):成员变量名(初值)…{//构造函数函数体}~类名(void){//析构函数函数体}};访问控制限定符:public-公有成员,谁都可以访问private-私有成员,只有声明该成员的类自己及其子类可以访问。

protected-保护成员,只有声明该成员的类自己及其子类可以访问。

class的缺省访控属性为私有,struct的缺省访控属性为公有。

2)构造函数函数名必须和类名完全相同,没有返回类型,当对象被创建时有系统自动调用,设置对象的初始状态。

复习:1.const只修饰它左边的,如果左边没有,就修饰它右边的。

const int * p;const修饰int,说明int具有常属性,int的值不能改变。

P是一个指针,指向int。

p里面所存的值可以改。

Int const *p;同上。

【常量指针:指向常量的指针】Int * const p;const修饰*,p具有常属性,p里面所存地址不能改。

但是指向的目标可以改。

【指针常量:拥有常属性的指针】2.时钟printf (“\r%02d:%02d:%02d”,m_hour,m_min,m_sec); //\r回到行首,\n回到行首并错开一行。

Cout << flush; //把缓冲区的内容显示到屏幕上。

***成员变量前加m_3.56.构造函数与初始化表1)构造函数可通过参数表的差别进行重载,不同版本的构造函数代表该对象不同的初始化方式。

2)构造函数典型的重载版本A.缺省构造函数,可以不带任何参数构造对象,表示对象缺省(默认)状态。

如果有参构造函数的所有参数都带有缺省值,那么该构造函数就也可以被当做缺省构造函数。

B.转换构造函数,可以通过单个参数调用的构造函数,从参数的类型隐式转换为所构造对象的类型。

通过explicit关键字可以强制通过这样的构造函数所进行的类型转换必须显式完成。

C.拷贝构造函数。

相关主题