C++学习笔记一
C++文件的执行过程
-- 预编译-->编译-->汇编-->链接
hello.c-->预处理-->hello.i-->编译器(ccl)-->hello.s-->汇编器(as)-->hello.o(库文件)-->连接器(ld)-->hello(可执行二进制)
预编译:展开包含的头文件、宏定义,将这些信息包含到当前文件中
编译:词法分析、语法分析、语义分析,检查无误后,代码翻译成汇编语言
汇编:把已经预编译好的文件编译成机器代码的过程
链接过程:针对一些库进行调用,如动态库和静态库。组合到目标文件中去
注意:对于静态库程序在编译链接的时候会把库的代码链接到可执行文件中去,而对于共享库文件,链接文件仅包含入口地址, 而不是外部函数所在的目标文件(动态库文件)的整个机器码,程序运行前要通过动态链接,使得外部函数的机器码由 操作系统从磁盘赋值到内存中
Gcc的一些命令: -o 产生目标文件
基本语法
1.注释:与java一样
2.基本数据类型 :bool -- boolean 宽字符型 wchar_t
3.类型修饰符: signed unsigned short long
可以使用一个或多个修饰
修饰符不一样,修饰的变量在内存中的所占大小不一样
4.typedef: 为已有的类型取一个新的名字
为zeGod结构体取一个huangze的名字
typedef struct zeGod{ String name; }huangze
5.常量:
①可以是十进制、八进制、十六进制。0x或者0X表示十六进制,0表示八进制,不带前缀的默认是十进制 212、0x4b、07
②常量也可以带一个后缀,后缀是U和L的组合,U表示无符号数,L表示长整数。后缀可以大写可以小写,不分顺序 212ul、0x4bL、07U
③定义常量的两个方式:#define预处理、const关键字(在执行期间不能被改变)
6.存储类 :
①static 局部变量:每个函数调用都可以改变 |||| 全局变量:作用域限制在生命他的文件内
②extern 通常用于两个或多个文件共享相同的全局变量和函数的时候
7.函数: 在文件开始进行声明
8.字符串和数组 : char str[] = "Hello";
9.指针: *p **p 加了*就是要变量值,而p是变量直接地址值
①c++NULL指针
a、在声明变量的时候,如果没有确切的地址可以赋值,可以声明为NULL是一个良好的编程习惯 int *p=NULL; count << *p << endl; p的值为0
b、检查一个是不是空指针, if(p) == if(p == NULL) 如果P不为空 , if(!p) == if(p != NULL) 如果P为空。建议使用前者,后者的NULL,在不同的平台上面,NULL可能会被定义成其他地址
②c++的算数运算 定义一个指针*p和数组,将数组地址付给p,利用for循环实现递增递减
int[] arr; int *p; p = arr;//数组直接替换成指针 数组的第一个元素的地址赋值给P //然后 p++表示第二个数组元素
③指针作为函数参数时,可以接受指针作为参数传给函数,也可以接受数组作为参数传递给函数
void getAvg(int *p,int size); main{ int arr[5] = { 1,1,1,1,1} getAvg(arr,5); //传递数组给函数 }
④ C++不支持在函数外返回局部变量的地址,除非定义局部变量为static变量。
10. 引用:
与指针的区别:
a.引用不可以是空的,引用必须是一块合法的内存。
b.一旦引用被初始化为一个对象,就不能指向另一个对象,指针可以再任何时候指向到另一个对象;
c.引用在创建时被初始化,指针可以再任何时间初始化 把引用作为方法参数: void swap(int& i, int& j); 把引用作为返回值: double& swap(int i,int j);
11.结构体:
①指向结构的指针
Books book1; struct Books *p; p = &book1;
12类:
① 简单结构
class Box{ Box();//构造函数 public: double a; double b; double c; double getResult(); //成员函数 double getA(double a){ return a; } }
②类外面定义函数
double Box::getResult(){ return 2.0; } Box::Box(void){ //类外面的构造函数 }
③ 指针函数调用
Box box1; Box *box; 调用函数: box = &box1; box->getResult();
13.继承
class Shape{ public: int a; } class Rectangle :public Shape{ ///Rectangle继承Shape } 多继承: class Shape{ public: int a; } class Box{ public: int b; } class Rectangle :public Shape,public Box { ///Rectangle继承Shape和Box }
14.接口(抽象类)
class Shape{ virtual int getArea()=0; } class Rectangle :public Shape{ public : int getArea(){ return 1; } }
15.动态内存 new和delete
①new :申请内存和创建对象
double *p = NULL;//初始化为null的指针,良好的编程习惯
p = new double; //为变量请求内存
②malloc()函数尽量不要使用。
16.namespace 命名空间
namespace ZeGod{ int a;
} 访问ZeGod的a ZeGod::a
17.using指令,
可以使用using namespace指令,这样在使用命名空间时,就不用在前面加上命名空间的名字了,这个代码告诉编译器,后续的代码使用指定的命名空间中的名称。
#inlcude <iostream> using name std; namespace ZeGod{ void fun(){ cout <<"ZeGod" <<endl; } } using namespace ZeGod; int main(){ ZeGod(); return 0; }
18.条件编译
①#ifdef 标识符 程序片段1 //如果标识符被#define定义过,执行片段1 #else 程序片段2 //否则对程序片段2进行编译 #endif ②:#ifndef与 #indef的功能相反
19.线程:
①::
a.作用域符号:前面一般是类的名称,后面一般是该类的成员名称 A,B表示两个类,在A,B中都由number,那么 A::number B::number
b.全局作用域,当全局变量在局部函数中与其中某个变量重名时,::全局A ,表示的是全局变量
c.类的外面定义函数,参考上面12的说明
d.如果是直接在全局函数之前的,表示是全局的函数
e.表示引用成员函数与变量, 例如:System::Math::Sqrt()相当于System.Math,Sqrt();
②: thread th1(t1); 创建并启动,t1是一个函数
thread::join(); 让主线程等待,直到子线程完成。
mutex m ; m.lock; m.unlock; 声明一个m线程同步类, std::lock_guard<mutex> lockguard(m);
20、虚函数 派生类与基础类之间形成多态性,
21、类对象和指针对象区别