C++--入门

Source

1. 命名空间

  • 使用命名空间是对标识符的名称进行本地化,以避免命名冲突或名字污染。
  • 定义命名空间,namespace+命名空间名称{变量,函数}
//普通的命名空间
namespace N1
{
    
      
	int a = 0;
	void fun1()
	{
    
      
		printf("N1:fun1()\n");
	}
	//嵌套
	namespace N2
	{
    
      
		int a = 1;
		void fun1()
		{
    
      
			printf("N1:N2:fun1()\n");
		}
	}
}
//分段定义
namespace N1
{
    
      
	int b = 3;
	void fun2()
	{
    
      
		printf("N1:fun2()\n");
	}
}
int a = 10;
void fun1()
{
    
      
	printf("fun1()\n");

}
void test()
{
    
      
	//全局的a
	printf("a: %d\n", a);
	//命名空间中的成员访问形式
	//命名空间+::+成员
	printf("N1::a: %d\n", N1::a);
	//using 命名空间::成员
	using N1::b;
	printf("N1::b %d\n", b);
	//展开命名空间:using namespace 命名空间  
	//不建议,命名空间下所有成员全部暴露在全局作用域中,会和全局域中的成员发生混淆
	using namespace N1;
	fun2();
	printf("N1::b: %d\n", b);
}

2. 缺省参数

  • 缺省参数是声明或定义时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定实参。
  • 全缺省:所有参数都有默认值
void fun1(int a = 1, int b = 2, int c = 3)
{
    
      
	cout << a << " " << b << " " << c << endl;
}

在这里插入图片描述

  • 半缺省:部分参数设置默认值
//半缺省:部分参数设置默认值
//设置的默认值必须从右向左依次连续,中间不能有间隔
void fun2(int a, int b, int c = 3)
{
    
      
	cout << a << " " << b << " " << c << endl;
}
void test()
{
    
      
	fun2(1, 2);
	fun2(1, 2, 4);
}

在这里插入图片描述

3. 函数重载

  • 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)必须不同。
int add(int a, int b)
{
    
      
	return a + b;
}
double add(double a,double b)//类型
{
    
      
	return a + b;
}
int add(int a, int b, int c)//参数个数
{
    
      
	return a + b + c;
}
int add(int a, double b)
{
    
      
	return a + b;
}
int add(double b, int a)//顺序
{
    
      
	return a + b;
}
  • C++支持函数重载,只要函数参数不同,修饰出来的名字就不一样
  • C语言不支持函数重载,同名函数没法区分
  • 在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern “C”,即可告诉编译器,将该函数按照C语言规则来编译

4. 引用

  • 引用是给已有的变量取一个别名,编译器不会为引用变量开辟内存空间,和其引用的变量共用同一块内存空间。
  • 引用类型必须和引用实体是同种类型
  • 类型& 引用变量名(对象名)=引用实体
void test()
{
    
      
	int a = 1;
	//ra是一个引用,是a的别名,指向和a相同的实体。
	int& ra = a;
}

引用特性

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦引用一个实体,就不能引用其他实体
  • 引用可以做参数(如交换函数),也可以做返回值
//做参数
void swap(int& a, int& b)//这里的引用是外部变量的别名
{
    
      
	int tmp = a;
	a = b;
	b = tmp;
}
//做返回值
int& count()
{
    
      
	static int n = 0;
	n++;
	return n;
}

5. 内联函数

  • 以inline修饰的函数叫内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数能提升程序的运行效率。
  • 适用规模较小而又被频繁调用的简单函数。
  • inline是以空间换时间的做法,不适用代码很长或者有循环或递归的函数作为内联函数。
  • inline不建议声明和定义分离,会导致链接错误找不到。
inline int add(int a, int b)//定义add为内联函数
{
    
      
	return a + b;
}
void test()
{
    
      
	int c = add(1, 2);//实际编译时:int c=1+2;
}

6. 基于范围的for循环

  • 对于一个有范围的集合,循环范围时容易出错,所以引入基于范围的for循环。
  • for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
void test()
{
    
      
	int arr[] = {
    
       1,2,3,4,5,6,7,8,9 };
	for (int i = 1; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
    
      
		cout << arr[i] << " ";
	}
	cout << endl;
	//范围for:当前数据:循环的范围
	for (int e : arr)
	{
    
      
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述