C++的命名空间、输入输出、重载、指针和引用的相关概念

来源:互联网 发布:淘宝注册商家有多少家 编辑:程序博客网 时间:2024/06/05 22:40

1 命名空间

在学习C++时,我们已经多次看到在程序中用了以下语句: using namespace std;这就是使用了命名空间std。那么,我们很容易就会问道:为什么要命名空间呢?下面来解决这个问题:1.原因:由于命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个集团的声明放在同一个命名空间中。2.命名空间的特点是:1) 命名空间可以是全局的,也可以位于另一个命名空间之中,但是不能位于类和代码块中。所以,在命名空间中声明的名称(标识符),默认具有外部链接特性(除非它引用了常量)。2) 在所有命名空间之外,还存在一个全局命名空间,它对应于文件级的声明域。因此,在命名空间机制中,原来的全局变量,现在被认为位于全局命名空间中。3) 标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构、类和函数等)都被定义在命名空间std(standard标准)中。3.命名空间的使用:由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:  1)直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl;  2)使用using关键字。 using std::cout; using std::endl; 以上程序可以写成 cout << std::hex << 3.4 << endl;  3)最方便的就是使用using namespace std; 4.命名空间的格式:有两种形式的命名空间——有名的和无名的。命名空间的定义格式为:(取自C++标准文档)。有名的命名空间:   namespace 命名空间名    {    声明序列可选   }无名的命名空间:   namespace    {          声明序列可选   }命名空间的成员,是在命名空间定义中的花括号内声明了的名称。可以在命名空间的定义内,定义命名空间的成员(内部定义)。也可以只在命名空间的定义内声明成员,而在命名空间的定义之外,定义命名空间的成员(外部定义)。

2 C++基本的输入输出流

1. 相关概念    在学习C++时,我们已经多次看到在程序中用了: cout和cin语句进行输出和输入,但他们并不是专门的语句结构,在C++中是通过调用输入输出流库中的流对象cin和cout实现输入输出功能,是在编译系统提供的I/O库中定义的。    C++的输入和输出是用“流”(stream)的方式实现的,“流”指的是来自设备或传给设备的一个数据流。数据流是由一系列字节组成,这些字节是按进入流的顺序排列的。    cout是输出流对象的名字,cin是输入流对象的名字,“《”是流插入运算符,作用是将需要输出的内容插入到输出流中,默认的输入设备是显示器,其中“》、《”符号的尖的方向,我将其认为数据流的流向;“》”是流提取运算符,其作用是从默认的输入设备的输入流中提取若干字节送到计算机内存区中指定的变量。   2. 输入输出的基本操作cin的基本操作格式为:cin>>变量1>>变量2>>…>>变量n;cout的基本基本操作为:cout<<表达式1<<表达式2<<...<<表达式n;举一个简单例子说明数据的流向:
    #include <iostream>    using namespace std;    int main()    {        int a = 0;       cin >> a;       cout << "a = " << a <<endl;       return 0;    }

其中的: 先定义一个变量, cin >> a,将数据流流向变量a,
示意图如下:

这里写图片描述

这里写图片描述
3. 输入输出流中控制符的使用
上面的是cin和cout的默认形式,但在对字符宽度有要求时,需要对输入输出流进行控制,常见的有dec,hex,oct,等。谭浩强的书中有具体介绍,这里不再阐述

3 重载

为什么要实现重载呢?

 函数重载相同作用域内的同一个标识符赋予不同的操作语义 ,即赋给同一个函数名多个含义,实质上就是实现了程序空间到代码空间的一对多映射。更直白地,在同一作用域类,一组函数的函数名相同,参数列表不同(个数不同/类型不同),返回值可同可不同。 C++中有两种重载:函数重载和运算符重载,而其中的运算符重载尤其重要,实质就是函数重载。C++ 中函数重载分为普通函数的重载和成员函数的重载 :   (1)普通函数的重载   用一个简单的例子来说明一下:
        #include<iostream>        using namespace std;        double add(int x,float y)         {             return x+y;         }        double add(float x,int y)         {             return x+y;         }         void main()         {             cout<<add(1,3.2)<<endl;             cout<<add(6.2,1)<<endl;         }

运行结果为:4.2,7.2
在同一作用域类内,由于参数类型不同,,一组函数的函数名相同,参数列表不同即类型不同),返回值可同可不同,像本例,返回值是相同的。
(2)成员函数的重载
用一个简单的例子来说明一下:

        #include<iostream>        using namespace std;        class A        {        public:            A():a(0)            {                cout<<"Default Constructure"<<a<<endl;            }            A(int x): a(x)            {                cout<<"Constructing"<<a<<endl;            } // 有参构造函数           private:int a;        };        void main( )        {             A a,a2(3);         }

对应于主函数中带有不同形式参数的函数,得到不同的结果。
  
  相似的,运算符重载赋予已有的运算符多重含义 ,即多种功
能。C++ 语言中通过重新定义运算符 ,使它能够用于特定类的对
象执行的特定的功能。一般情况下运算符重载有两种形式 ,重载
为类的成员函数和重载为有元函数两种。相关内容会在默认函数的运算符中介绍,这里不再赘述。

4 指针和引用

为什么要使用引用呢?
使用引用调用的时候,进行的是地址的传递,这样就使得两者的地址和值都是一样的,就是c/c++中的很简单的一个引用级别的地址传递,不调用其他函数,减少了程序调用的花销。
1) 定义: 引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。实际上使用的是一块相同的空间。
2) 格式:定义的格式为:
类型&引用变量名 = 已定义过的变量名;
3) 引用的特点:
1. 一个变量可取多个别名
2. 引用必须初始化
3. 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
【注意】:
引用和指针的区别和联系:
1. 引用只能在定义时初始化一次,之后不能改变指向
2. 引用必须指向有效的变量,指针可以为空。
3. sizeof指针对象和引用对象的意义不一样。sizeof
4. 指针和引用自增(++)自减(–)意义不一样。
5. 相对而言,引用比指针更安全。
由于涉及内容较多,只简单阐述了下~~~

原创粉丝点击