C++总结(1):namespace、引用、函数重载和cout格式输出

这几年项目的代码都是用C语言写的,可以说其它的基本上都忘得差不多了。将来有的Linux项目可能要用C++来写,所以还是决定复习并总结一下C++的语法和一些库的使用,主要是一些总结性的内容供日后使用到的时候来翻看,这样慢慢地也就记下来了。这系列的文章不定时进行更新,对于简单的知识,会在一篇文章中总结多个部分的内容。本文将介绍namespace、引用、函数重载和cout格式化输出的概念。

1 namespace

命名空间指的是可以在程序中创建的各种块,用于对所有类似的对象进行分组,并且可以引用块内的所有变量、函数或类。通过这种方式,我们可以创建单独的作用域,并在程序中重用存在于不同命名空间中的相同变量名。命名空间的使用允许我们处理多个库中的文件。命名空间的特点如下:

  • 命名空间只能在全局声明
  • 命名空间内可以嵌套别的命名空间

1、命名空间的声明

namespace namespacename 
{
	//code declarations where m and n are declared in namespace_name's scope
	int m, n;
}

我们可以用操作符::来访问命名空间中的变量或函数:

namespace_name :: variablename
namespace_name :: functionname

如果命名空间未命名,则可以以与访问全局变量相同的方式显式访问其中指定的变量和函数。
2、命名空间的嵌套
例子:

namespace example1 {
  namespace example2 {
    namespace example3 {
      int sample;
    }
  }
}

访问sample变量:

example1::example2::example3::sample.

3、using namespce
通过使用using-指令和如下所示的语法,你可以将整个命名空间插入到一段代码中:

using namespace namespacename;

这种用法最常见的例子是:using namespace std,它用于访问名为standard的名称空间,其中包括C++的I/O对象cout和cin。
4、例子
简单地举一个例子:

#include <iostream>

using namespace std;
//Creating nested namespaces
namespace no1 {
  // Declaring variable within the namespace no1
  int sample = 10;
  namespace no2 {
    namespace no3 {
      // Declaring variable within the namespace no3 
      // that initializes to the variable sample in namespace no1
      int sample1 = sample;
    }
  }
}
//Creating namespace that allows us to use it explicitly to access a variable in the nested namespace
namespace myalias = no1::no2::no3;
//Creating namespace demo and declaring an initialized variable
namespace demo {
  int gvar = 200;
}
//Inserting the entire namespace demo into our code
using namespace demo;

int main() {
  //Accessing the variable without the scope resolution operator as it is a global namespace
  cout << "Value of global variable in demo namespace = " << gvar << "\n";
  //Accessing the value of sample1 using the namespace myalias
  cout << "Value of sample1 in nested namespace third = " << myalias::sample1 << "\n";
  return 0;
}

5、总结
通过使用命名空间,我们可以防止同一程序中具有相同变量名和函数名的文件中的冲突。使用命名空间在不同的文件和库中定义相同的代码可以提高代码的可读性。

2 引用

当一个变量声明为引用时,它可以作为一个已存在变量的别名。这很像C语言中的指针,但是对于PHP、Java等语言来说都没有指针,而有引用的概念。这是因为它们不用操作系统芯片的寄存器,并且大多数是用在自己定义的变量内存中。但是很多粗心的程序员就会访问空指针,对于引用来说,它可以避免这种情况。

在C语言中,&可以用来获取一个变量的地址,而在C++中,&还以用来声明一个引用。下面来看一个例子

int a = 100;
int &b = a;
cout << "a = " << a << ",b = " << b <<endl;
cout << "&a = " << &a << ",&b = " << &b <<endl;
--------------
output:
a = 100,b = 100
&a = 0x61fe14,&b = 0x61fe14

也就是说ab的地址是相同的,我们可以通过ab来改变同一个内存里面的值。

  • 与指针不一样的是,引用必须在初始化的时候就赋值,而且初始化完之后不能改变,所以上面的引用可以理解为指针的const声明:int * const p = &a
  • 当该引用类型声明为const时,在实参与函数声明的引用参数类型不一致或参数不是一个左值时,编译器将生成一个临时变量。比如参数为const double &a,传进来的是一个int类型的数值1或者直接一个浮点数1.0,则编译器将创建一个临时的匿名变量,让a指向它,这个匿名变量仅在函数调用期间存在。
  • 引用作为函数返回值:如果函数的返回值没有声明为引用的话,这个返回值将先保存在一个临时位置,然后将其拷贝给保存函数返回值的变量。而如果函数返回值是引用的话,将直接从原始变量中拷贝。

3 函数重载

C++有一个新的特性:多态。它是指在一定的条件下出现不同的形式,对于函数来说,就允许函数有多种形式。类似的,在C++中函数重载就是可以有多个同名但参数不同的函数。编译器通过对比参数来解析相关函数。

  • 函数重载与函数的返回类型无关,当且仅当两个函数有相同的返回类型,不同的参数类型或参数个数时,才可以被定义为重载

例子:

int demo(int a, int b);
int demo(int c, int d, int e);
int demo(float c, float d);

4 cout格式化输出

当涉及到C++中的格式化输出cout时,头文件提供了一些额外的函数和操纵符,用于进一步控制输出的精度和格式。下面是一些常见的函数和操纵符:
1、设置浮点数的精度为n位
std::setprecision(n)std::cout << std::setprecision(4) << myFloat将浮点数输出为四位精度。
2、设置浮点数的输出格式为定点表示法(小数点位数是固定的)
std::fixedstd::cout << std::fixed << myFloat将浮点数以定点表示法输出。
3、设置浮点数的输出格式为科学计数法
std::scientificstd::cout << std::scientific << myFloat将浮点数以科学计数法输出。
4、设置字段的宽度为n个字符
std::setw(n)std::cout << std::setw(8) << myString将字段宽度设置为8个字符。
5、设置填充字符为c
std::setfill(c)std::cout << std::setfill('*') << std::setw(10) << myString将字段宽度设置为10个字符,并用星号填充空白部分。
6、使输出左对齐
std::leftstd::cout << std::left << std::setw(10) << myString将字段左对齐输出。

  • std::right为右对齐(默认方式)

猜你喜欢

转载自blog.csdn.net/tilblackout/article/details/131118389