【c++】c++初识--基本知识梳理(2)
来源:互联网 发布:node.js硬实战115 pdf 编辑:程序博客网 时间:2024/06/01 10:16
5.引用VS指针
(1)作用:引用是给变量起一个别名;
(2)定义引用的一般格式:
类型 &引用名 = 变量名;
例如:
int a = 1;int &b = a; //b是的别名,因此a和b是同一个单元
(PS:定义引用时一定要初始化,指明引用变量是谁的别名)
在实际应用中,引用一般用作参数传递与返回值。
(3)const引用是指向const对象的引用
const int ival = 1024; //const int& refval = ival; //正确int &ref2 = ival; //错误
(4)函数传参:按引用传递
引用传递方式是在函数定义时在形参前面加上引用运算符&;
例如:voidswap(int &a, int &b);
引用作为参数对形参的任何操作都能改变响应的实参数据,又使函数调用显得方便、自然。
(5)引用可作为函数的返回值,放在赋值运算符左边;
#include<iostream> using namespace std; int& func(int &num){ return num;} int main(){ int num=1; func(num)=7; cout<<"num = "<<num<<endl; return 0;}
结果为:num = 7;
(6)引用与指针的区别
引用访问一个变量是直接访问,而指针是间接访问;
引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间;
引用一经初始化不能再引用其他变量,而指针可以重新指向其他变量。
(尽可能使用引用,不得已时使用指针)
6.函数升级
(1)内联函数的使用
inline int add(int a, int b){ return a + b;}
inline int add(int a, int b)
{
return a + b;
}
宏函数
#define ADD(a, b) a + b
(2)内联函数与宏函数的区别
内联函数调用时,要求实参和形参的类型一致,另外内联函数会先对实参表达式进行求值,然后传递给形参;而宏调用时只用实参简单地替换形参。
内联函数是在编译的时候,在调用的地方将代码展开,而宏则是在预处理时进行替换的;
在c++中最好用inline函数替代带参数的宏。
(3)函数重载(overload)
定义:相同的作用域,如果两个函数名称相同,而参数不同,称为重载(overload)
条件:编译器通过检查实际参数的个数、类型和顺序确定相应的被调用函数。
name managling(名字改编):c++为了支持重载,会将相同的函数名根据形参的不同而改编成不同的名字加以识别。
实现c与c++混合编程:extern “C”
ifdef __cplusplusextern “C”{#endif……#ifndef __cplusplus}#endif
带默认形参值的函数:
函数没有声明时,在函数定义中指定形参的默认值;
函数既有定义又有声明时,声明指定后,定义时就不能再指定默认值;
默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值。
voidfunc(int a, double b = 4.2, int c= 3); //合法 voidfunc(int a = 3, double b, int c = 3); //不合法
函数调用时,实参与形参按从左到右的顺序进行匹配。
7.命名空间
(1)c语言 VS c++
c语言中所有的全局标识符共享同一个作用域,标识符之间可能发生冲突
c++中提出了命名空间的概念:
命名空间将全局作用域分成不同的部分;
不同命名空间中的标识符可以同名而不会发生冲突;
命名空间可以互相嵌套;
全局作用域也叫默认命名空间。
(2)如何定义命名空间
c++命名空间的定义:
namespace name{…}
namespace First{ int I = 0;}namespace Second{ int I = 1; namespaceInternal { struct p { int x; int y; }; }}
(3)c++命名空间的使用
使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable;
使用默认命名空间中的变量:::variable
示例:
#include<iostream> usingnamespacestd; namespaceFirst{ inti=1;}namespaceSecond{ inti=2; namespaceInternal { structmystruct { intx; inty; }; }} int main(){ usingnamespaceFirst; usingSecond::Internal::mystruct; cout<<"i = "<<i<<endl; cout<<"second i = "<<Second::i<<endl; mystructnode={3,4}; cout<<"node.x = "<<node.x<<endl; cout<<"node.y = "<<node.y<<endl; return0;}
- 【c++】c++初识--基本知识梳理(2)
- 【c++】c++初识--基本知识梳理(1)
- C基本知识
- 初识C#
- 【C#】初识
- 初识 C#
- 【C#】初识
- c\c++梳理
- C语言基础知识梳理
- C语言知识点梳理
- 黑马程序员:C语言基本知识(2)
- C语言的基本知识整理(2)
- C/C++基本知识
- C,C++基本知识
- c语言基本知识点滴
- Objective C 基本知识
- object-c基本知识
- [C++] 静态变量基本知识
- c++中的const应用
- C++ 枚举类型详解
- 【centos7】安装redis
- hdu1233-还是畅通工程(Kruskal)
- 学习u3d笔记(二) 创建灯光组件
- 【c++】c++初识--基本知识梳理(2)
- Random类 (java.util)
- Jenkins-HTML5 Notifier Plugin
- 漂亮的thinkphp 跳转页封装
- Python格式化输出
- js 比较时间大小
- dede修改描述description限制字数长度
- spring3.x第六章 SpringAOP基础
- Linux 杀同一个关键词的多个进程