回顾:
1 语言概述
C++98、C++11/C++0x
2 第一个C++程序
cpp、g++、cout/cin
stdio.h-->cstdio
3 名字空间
1)namespace 名字空间名{成员...}
2)使用
名字空间名::成员;
名字空间指令,using namespace std;
名字空间声明,using 名字空间名::成员;
3)无名名字空间
::成员;
4)名字空间嵌套
4 C++结构体、联合体、枚举
5 C++字符串string
6 bool类型
7 操作符别名 || -- or && -- and
=====================
八 C++的函数
1 函数重载
eg:假设有一个图形库
C语言:
drawCircle(int x,int y,double r);
drawRect(int x,int y,double w,double h);
...
C++:
drawImage(int x,int y,double r);
drawImage(int x,int y,double w,double h);
...
1.1 定义
在相同的作用域中,定义同名的函数,但是他们的参数有所区别,这样的函数构成重载关系。
注:函数重载与返回类型无关
1.2 函数重载匹配
调用重载关系的函数时,编译器将根据实参和形参的匹配程序,自动选择最优的重载版本。
g++ V4.4.7匹配的一般规则:
完全匹配>常量转换>升级转换>降级转换>省略号匹配
1.3 函数重载原理
C++编译器是通过对函数进行换名,将参数表的信息整合到新的函数名中,实现解决函数重载与名字冲突的矛盾。
笔试题:extern "C"声明的作用?
答案:函数声明加入extern "C"要求C++编译器不对函数做换名,便于C程序去调用该函数。
使用语法:
extern "C" void func(..){}
extern "C"{
void func1(..){}
void func2(..){}
......
}
2 C++函数的缺省参数
2.1 可以函数的部分或者全部形参制定缺省值,调用该函数时,如果不给实参,就去缺省值作为相应的形参的值。
void func(int a,int b,int c=缺省值){..}
2.2 缺省参数必须靠右,如果一个参数有缺省值,那么这个参数的右侧所有参数都必须带有缺省值;
eg:
void func(int a = 10,int b);//error
void func(int b,int a = 10);//ok
2.3 如果函数的定义和声明分开,缺省参数写在函数的声明部分,而定义部分不写。
void func(){}-->函数定义
void func(); -->函数声明
3 C++函数哑元参数
3.1 定义
只有类型没有变量名的形参称为哑元
eg:
void func(int/*哑元*/){..}
3.2 使用哑元的场景
1)为了兼容以前的代码
eg:
算法库函数:void math_func(int a,int b){...}
使用算法库:
int main(void){
math_func(10,20);
...
math_func(100,200);
...
math_func(300,400);
}
---------------------------------
升级算法库函数:void math_func(int a,int){...}
2)运算符重载中,区分前后++/--(后面讲)
4 C++的内联函数
//笔试题:inline关键字的作用?
4.1 定义
使用inline关键字修饰的函数,表示这个函数是内联函数,编译器将会尝试做内联优化,避免函数调用的开销。
4.2 inline使用的场景
1)多次调用的小而简单的函数适合内联,而调用次数少或者大而复杂的函数不适合内联。
2)递归函数不适合内联。
注:内联修饰是一种建议而不是强制要求,一个函数能否内联优化主要取决于编译器,有些函数不加inline关键字也会默认处理为内联展开,有些函数即便加了inline关键字也会被编译器忽略。
================
九 C++的动态内存分配
笔试题:C语言中malloc/free和new/delete的区别
1)C语言
malloc()/calloc()/realloc():分配内存
free():释放内存
2)C++使用new/delete运算符实现动态内存分配和释放
new/new[]:分配内存
delete/delete[]: 释放内存
int* pi = new int;//分配sizeof(int)
*pi = 10;
delete pi;
pi = NULL;
int* pa = new int[10];//分配sizeof(int)*10
pa[0] = 10;//*(pa+0) = 10;
pa[1] = 20;//*(pa+1) = 20;
....
pa[9] = 30;//*(pa+9) = 100;
delete[] pa;
pa = NULL;
====================
//分配内存同时初始化
int* pi = new int(100);
//分配数组同时初始化,需要C++11标准
int* pa = new int[5]{10,20,30,40,50};
-----------------------
十 C++的引用(Reference)//非常重要
1 定义
引用就是别名,对引用的操作与对该变量的操作完全相同
类型 & 引用名(别名) = 变量;
eg:
int a = 10;
int& b = a;//b就是a的别名
b++;//等价与a++;
cout << a << endl;//11
1)引用定义时必须绑定一个变量,初始化以后引用的目标不能修改。
eg:
int a = 10;
int& b;//error
eg:
int a = 10;
int& b = a;
int c = 20;
b = c;//不是修改引用目标,而是将c赋值给a
2)引用类型与绑定的变量类型必须完全相同
eg:
int a = 10;
double& b = a;//error
2 const引用(常引用)
2.1 定义引用时加const修饰,即为常引用,不能通过常引用修改引用的目标;
eg:
int a = 10;
const int& b = a;
b = 20;//error
2.2 普通的引用只能引用左值,常引用既能引用左值也能引用右值,常引用也叫万能引用。
1)左值:可以放在赋值运算符左边的变量或表达式
注:普通的变量都是左值
2)右值:只能放在赋值运算符的右边,不能放在左边
注:常量都是右值
eg:
int& r = 100;//error
const int& r = 100;//ok
3 引用型函数的参数
3.1 将引用用于函数的参数,可以修改实参变量的值,可以减小函数调用的开销。
3.2 引用参数有可能意外修改实参的值,如果不希望修改实参本身,可以将形参定义为常引用,提高传参效率的同时还可以接收常量型的实参。
练习:总结引用和指针的区别(手机百度)
==============
const int* p = "hello";
int const* p = "hello";
int* const p = "hello";
const int* const p = "hello";
=============
1 语言概述
C++98、C++11/C++0x
2 第一个C++程序
cpp、g++、cout/cin
stdio.h-->cstdio
3 名字空间
1)namespace 名字空间名{成员...}
2)使用
名字空间名::成员;
名字空间指令,using namespace std;
名字空间声明,using 名字空间名::成员;
3)无名名字空间
::成员;
4)名字空间嵌套
4 C++结构体、联合体、枚举
5 C++字符串string
6 bool类型
7 操作符别名 || -- or && -- and
=====================
八 C++的函数
1 函数重载
eg:假设有一个图形库
C语言:
drawCircle(int x,int y,double r);
drawRect(int x,int y,double w,double h);
...
C++:
drawImage(int x,int y,double r);
drawImage(int x,int y,double w,double h);
...
1.1 定义
在相同的作用域中,定义同名的函数,但是他们的参数有所区别,这样的函数构成重载关系。
注:函数重载与返回类型无关
1.2 函数重载匹配
调用重载关系的函数时,编译器将根据实参和形参的匹配程序,自动选择最优的重载版本。
g++ V4.4.7匹配的一般规则:
完全匹配>常量转换>升级转换>降级转换>省略号匹配
1.3 函数重载原理
C++编译器是通过对函数进行换名,将参数表的信息整合到新的函数名中,实现解决函数重载与名字冲突的矛盾。
笔试题:extern "C"声明的作用?
答案:函数声明加入extern "C"要求C++编译器不对函数做换名,便于C程序去调用该函数。
使用语法:
extern "C" void func(..){}
extern "C"{
void func1(..){}
void func2(..){}
......
}
2 C++函数的缺省参数
2.1 可以函数的部分或者全部形参制定缺省值,调用该函数时,如果不给实参,就去缺省值作为相应的形参的值。
void func(int a,int b,int c=缺省值){..}
2.2 缺省参数必须靠右,如果一个参数有缺省值,那么这个参数的右侧所有参数都必须带有缺省值;
eg:
void func(int a = 10,int b);//error
void func(int b,int a = 10);//ok
2.3 如果函数的定义和声明分开,缺省参数写在函数的声明部分,而定义部分不写。
void func(){}-->函数定义
void func(); -->函数声明
3 C++函数哑元参数
3.1 定义
只有类型没有变量名的形参称为哑元
eg:
void func(int/*哑元*/){..}
3.2 使用哑元的场景
1)为了兼容以前的代码
eg:
算法库函数:void math_func(int a,int b){...}
使用算法库:
int main(void){
math_func(10,20);
...
math_func(100,200);
...
math_func(300,400);
}
---------------------------------
升级算法库函数:void math_func(int a,int){...}
2)运算符重载中,区分前后++/--(后面讲)
4 C++的内联函数
//笔试题:inline关键字的作用?
4.1 定义
使用inline关键字修饰的函数,表示这个函数是内联函数,编译器将会尝试做内联优化,避免函数调用的开销。
4.2 inline使用的场景
1)多次调用的小而简单的函数适合内联,而调用次数少或者大而复杂的函数不适合内联。
2)递归函数不适合内联。
注:内联修饰是一种建议而不是强制要求,一个函数能否内联优化主要取决于编译器,有些函数不加inline关键字也会默认处理为内联展开,有些函数即便加了inline关键字也会被编译器忽略。
================
九 C++的动态内存分配
笔试题:C语言中malloc/free和new/delete的区别
1)C语言
malloc()/calloc()/realloc():分配内存
free():释放内存
2)C++使用new/delete运算符实现动态内存分配和释放
new/new[]:分配内存
delete/delete[]: 释放内存
int* pi = new int;//分配sizeof(int)
*pi = 10;
delete pi;
pi = NULL;
int* pa = new int[10];//分配sizeof(int)*10
pa[0] = 10;//*(pa+0) = 10;
pa[1] = 20;//*(pa+1) = 20;
....
pa[9] = 30;//*(pa+9) = 100;
delete[] pa;
pa = NULL;
====================
//分配内存同时初始化
int* pi = new int(100);
//分配数组同时初始化,需要C++11标准
int* pa = new int[5]{10,20,30,40,50};
-----------------------
十 C++的引用(Reference)//非常重要
1 定义
引用就是别名,对引用的操作与对该变量的操作完全相同
类型 & 引用名(别名) = 变量;
eg:
int a = 10;
int& b = a;//b就是a的别名
b++;//等价与a++;
cout << a << endl;//11
1)引用定义时必须绑定一个变量,初始化以后引用的目标不能修改。
eg:
int a = 10;
int& b;//error
eg:
int a = 10;
int& b = a;
int c = 20;
b = c;//不是修改引用目标,而是将c赋值给a
2)引用类型与绑定的变量类型必须完全相同
eg:
int a = 10;
double& b = a;//error
2 const引用(常引用)
2.1 定义引用时加const修饰,即为常引用,不能通过常引用修改引用的目标;
eg:
int a = 10;
const int& b = a;
b = 20;//error
2.2 普通的引用只能引用左值,常引用既能引用左值也能引用右值,常引用也叫万能引用。
1)左值:可以放在赋值运算符左边的变量或表达式
注:普通的变量都是左值
2)右值:只能放在赋值运算符的右边,不能放在左边
注:常量都是右值
eg:
int& r = 100;//error
const int& r = 100;//ok
3 引用型函数的参数
3.1 将引用用于函数的参数,可以修改实参变量的值,可以减小函数调用的开销。
3.2 引用参数有可能意外修改实参的值,如果不希望修改实参本身,可以将形参定义为常引用,提高传参效率的同时还可以接收常量型的实参。
练习:总结引用和指针的区别(手机百度)
==============
const int* p = "hello";
int const* p = "hello";
int* const p = "hello";
const int* const p = "hello";
=============