【C++】C++ 基础知识
来源:互联网 发布:firefox知乎 编辑:程序博客网 时间:2024/06/07 19:58
1. 命名空间
名字空间域是随标准 C++ 而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字 namespace 开头给它起一个名字:
namespace name1{int a = 0;}namespace name2{int a = 1;}name1::a = 3;name2::a = 4;
名字空间域解决了全局命名冲突的问题。
标准 C++ 库中的所有组件都是在一个被称为 std 的名字空间中声明和定义的。在采用标准 C++ 的平台上使用标准 C++ 库中的组件,只要写一个 using 指示符:using namespace std; 就可以直接使用标准 C++ 库中的所有成员。或者 std::成员 的方式也可以使用 C++ 库里的成员。其中::是作用域解析符。
namespace std // std是C++标准库的名字空间{ // 标准库成员}
举例:
#include <iostream>using namespace std;int main(){std::cout << "hello world" << std::endl;system("pause");return 0;}
运行结果如下:2. C++基本的输入输出流
cout 是标准输出流对象,<< 是输出操作符;
cin 是标准输入流对象,>>是输入操作符;
endl 是换行操作符;
它们都属于C++标准库,所以都在 std 的名字空间里面。
举例:
#include <iostream>using namespace std;int main(){int i1 = 1;double d1 = 5.55;cout << "c++ type:" << "int->" << i1 << " double->" << d1 << endl;cout << "please input int and double:";cin >> i1 >> d1;cout << "c++ type:" << "int->" << i1 << " double->" << d1 << endl;system("pause");}
运行结果如下:3. 重载(C++为什么支持重载?)
函数重载:在同一作用域类,一组函数的函数名相同,参数列表不同(个数不同/类型不同),返回值可相同可不同。
对于 C++ 语言作为一种欲与 C 兼容的语言,C++ 语言保留了一部分过程式语言和特点,foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息,C++ 语言就是靠这种机制来实现函数重载的。
为什么C++支持函数重载,而C语言不支持呢?
从代码的编译到运行,在 VC6.0 或 VS 这种编译器下,它是系统直接完成了翻译与链接,直接生成了运行结果。
编译器内部完成了翻译部分:
1)预处理
(1)头文件展开
(2)宏的替换
(3)去注释
(4)条件编译
2)编译过程:将高级语言转为汇编语言
3)汇编过程:汇编语言转为二进制程序
链接部分:将所引用的数据链接进来
比如一个函数的声明如下:void function(int x,int y);
在 C 语言中,编译器在编译后在库中的名字为 _function;在 C++ 中,编译器在编译后在库中的名字为_function_int_int。
还有一个函数的声明如下:void function(float x,float y);
在 C 语言中,编译器在编译后在库中的名字为_function;在 C++ 中,编译器在编译后在库中的名字为_function_float_float。
在链接时,都是找名字进行链接的,就比如以上两个函数,在 C 语言中两个的名字一样,就会在链接中报错。C++ 中它们的名字不一样,就不会报错。
我们可以在 Linux 下使用 objdump 查看目标文件中的函数名字的修饰来认识函数重载。
4. C++缺省参数
// 全缺省参数int Add1(int a = 0, int b = 0){return a + b;}// 半缺省参数int Add2(int a, int b = 0){return a + b;}void Test(){Add1();Add1(1);Add1(1, 1);Add2(2);Add2(2, 2);}
半缺省参数:当有多个参数时,缺省在右边且是连续的。
5. 指针和引用
1) 概念:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
2)格式:类型 &引用变量名 = 已定义过的变量名;
特点:(1)一个变量可取多个别名
(2)引用必须初始化
(3)引用只能在初始化的时候引用一次,不能改变再引用其他的变量。
3)做参数:
(1)值传递:如果形参为非引用的传值方式,则生成局部临时变量接收实参的值。
void Swap (int left, int right){ int temp = left; left = right ; right = temp ;}
(2)引用传递:如果形参为引用类型,则形参是实参的别名。
void Swap (int& left, int& right){ int temp = left; right = left ; left = temp ;}
(3)指针传递:void Swap (int* pLeft, int* pRight){ int temp = *pLeft; *pLeft = *pRight; *pRight = temp;}void TestReference2 (){ int a = 1; int b = 2; cout<<"a:" <<a<< endl; cout<<"b:" <<b<< endl; Swap (a , b); cout<<"a:" <<a<< endl; cout<<"b:" <<b<< endl;}
当不希望函数内改变参数 x 的值时,尽量使用常引用传参。
4)做返回值:int& Add (int d1, int d2) //传引用做返回值// int Add ( int d1 , int d2) //传值做返回值{ int ret = d1 + d2; return ret ;}void (){ int a = 3, b = 4; int c = Add( a, b ); cout<<"c:" <<c<< endl;}
不要返回一个临时变量的引用。如果返回对象出了当前函数的作用域依旧存在,最好使用引用返回,因为这样更高效。
5)引用和指针的区别和联系
(1)引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
(2)引用必须指向有效的变量;指针可以为空。
(3)sizeof 指针对象和引用对象的意义不一样。sizeof 引用得到的是所指向的变量的大小;而 sizeof 指针是对象地址的大小。
(4)指针和引用自增(++)和自减(--)意义不一样。
(5)相对而言,引用比指针更安全。
指针比引用更灵活,但是也更危险。使用指针时一定要注意检查指针是否为空。指针所指的地址释放以后最好置 0,否则可能存在野指针问题。
- C 基础知识
- C 基础知识
- C基础知识
- C 基础知识
- c基础知识
- c基础知识
- c基础知识
- [C]基础知识
- c基础知识
- C基础知识
- 汇编基础知识 - [C/C++]
- 内存相关(C/C++)基础知识
- 【c#】c sharp的基础知识
- C语言基础知识
- C/C++一些基础知识
- C语言基础知识1
- c语言基础知识
- C语言基础知识
- testNG
- jmeter数据库连接方法
- Shiro 工作流程及其Spring集成配置分享
- 开放数据集集合
- 簧片检测
- 【C++】C++ 基础知识
- CodeVS3066 中缀转后缀 题解
- VS2013编译提示无法运行“rc.exe”错误
- Java设计模式-外观模式
- 第一个内核模块
- 构造01串满足要求
- 搭建环信即时通讯官方Android样例工程-eclipse版
- Spring入门之bean的配置
- 老男孩教育总结的运维必会150条命令