day02 C++的函数重载、内联函数 、哑元参数、动态内存分配 、引用

来源:互联网 发布:mysql function 赋值 编辑:程序博客网 时间:2024/05/18 00:25
回顾:
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";
=============
 
阅读全文
0 0