【C++】C++入门

小明 2025-05-03 21:40:36 7

关于C++是什么

C��言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。

1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

C++在许多领域都有广泛的应用,包括游戏开发、系统/应用软件、驱动和嵌入式系统开发、高性能服务器和客户端应用,以及创建大型复杂的图形用户界面和数据库应用。

一、关键字

C语言中的关键字有32个,C++中的关键字有63个,几乎增长了一倍。

asmdoifreturntrycontinueautodoubleinline
shorttypedefforbooldynamic_castintsignedtypeidpublic
breakelselongsizeoftypenamethrowcaseenummutable
staticunionwchar_tcatchnamespaceexplicitstatic_castunsigneddefault
charexportnewstructusingfriendclassexternoperator
switchvirtualregisterconstfalseprivatetemplatevoidtrue
whileprotectedthisvolatileconst_castdeletetemplategotoreinterpret_cast

二、命名空间

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

2.1 命名空间的作用

命名空间能够避免命名冲突。当模块越来越大时,不同模块中可能存在相同名称的类、函数等。使用命名空间可以将相关的类和函数分组,有效避免这些名称冲突。

例子:在下面这个代码中就会发生命名冲突,原因是因为全局中定义了一个rand变量,而头文件#include 中包含了rand函数的声明,这样就导致了命名冲突,最终编译报错。

#include 
#include 
//命名冲突
int rand = 0;
int main()
{
	printf("%d", rand);
	return 0;
}

2.2 命名空间定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

下面代码就展示了如何定义命名空间,关键字 + 命名空间的名字 ,aj 是我CSDN的名字,这里就用他来做我命名空间的名字,而命名空间的名字是可以按照自己的想法自由定义。

namespace aj  //我CSDN的名字
{
	int rand = 0;
}

命名空间的成员不仅仅可以是内置类型、自定义类型,还可以是函数。

namespace aj  //我CSDN的名字
{
	//内置类型
	int rand = 0;
	//函数
	void Swap(int* e1, int* e2)
	{
		int tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
	}
	//自定义类型
	struct SeqList
	{
		int* a;
		int size;
		int capacity;
	};
}

命名空间能够嵌套使用

namespace aj  //我CSDN的名字
{
	//内置类型
	int rand = 0;
	//函数
	void Swap(int* e1, int* e2)
	{
		int tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
	}
	//自定义类型
	struct SeqList
	{
		int* a;
		int size;
		int capacity;
	};
	namespace aj1
	{
		int rand = 1;
		int Add(int x1, int x2)
		{
			return x1 + x2;
		}
	}
}

同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

namespace aj  //我CSDN的名字
{
	int i = 0;
}
namespace aj  //我CSDN的名字
{
	double d = 0; 
}
/*namespace aj  //我CSDN的名字
{
	int i = 0;
	double d = 0;
}*/

在这里可以试验出两个相同名称的命名空间编译并不会报错,前面两个命名空间会合并成第三个命名空间。


2.3 命名空间的使用

定义一个命名空间就相当于产生了一个新的作用域,在全局中并不能直接使用命名空间中的成员。

使用命名空间中成员的方法一共有三种:

  1. 加命名空间名称及作用域限定符 ( :: 作用域限定符)
  2. 用 using 将命名空间内某个成员引入 ( using + 命名空间名称 :: 成员名)
  3. 使用 using namespace 加命名空间名称引入

  • 加命名空间名称及作用域限定符 ( :: 作用域限定符)
    namespace aj  //我CSDN的名字
    {
    	//内置类型
    	int rand = 0;
    }
    int main()
    {
    	printf("%d\n", aj::rand);  //命名空间中的rand
    	printf("%p\n", rand);      // #inlcude  中 rand 函数地址
    	return 0;
    }
    
    • 用 using 将命名空间内某个成员引入 (using + 命名空间名称 :: 成员名)

      在下面的代码中,我使用 (using + 命名空间名称 :: 成员名 )的方法将命名空间中的成员i 引入,那么成员 i 就能够在全局中被使用,而 d 未被引入,使用 d 就会报错。

      namespace aj  //我CSDN的名字
      {
      	//内置类型
      	int i = 0;
      	double d = 0.0;
      }
      using aj::i;
      int main()
      {
      	printf("%d", i);
      	printf("%lf", d);
      	return 0;
      }
      

      注意:如果使用 using + 命名空间名称 :: 成员名导入的成员与函数名相同,会产生名称冲突。

      • 使用 using namespace 加命名空间名称引入
        namespace aj  //我CSDN的名字
        {
        	//内置类型
        	int i = 0;
        	double d = 0.0;
        }
        using namespace aj;
        int main()
        {
        	printf("%d", i);
        	printf("%lf", d);
        	return 0;
        }
        

        using namespace 加命名空间名称与普通using作用相同,但前者是对整个命名空间作用,把该命名空间下的所有类、函数、常量等均导入当前作用域。

        注意:若将整个命名空间中的所有成员全部导入当前作用域,那么就相当于这个命名空间失效,则有没有这个命名空间都相同,所以说这种方法不是很推荐,推荐前两种方法。


        三、C++ 的输入、输出

        • C++中使用cout 标准输出对象和cin 标准输入对象时,必须包含#include 头文件以及按命名空间使用方法使用std。

          cout --> console 控制台 + out cout 表示标准输出,它输出到控制台。

          cin --> console 控制台 + in cin 表示标准输入,它从键盘接收输入。

          #include
          // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
          using namespace std ;
          int main()
          {
          	cout 
          	int num1 = 0;
          	int num2 = 0;
          	//C语言的输入输出
          	scanf("%d", &num1);
          	printf("%d\n", num1);
          	//C++的输入输出
          	cin  num2;
          	cout 
          	cout 
          	Print();
          	Print(520);
          	Print(1314);
          	return 0;
          }
          
          	cout 
          	Print();
          	Print(10);
          	Print(10, 20);
          	Print(10 , 20 ,30);
          	return 0;
          }
          
          	cout 
          	Print(10);
          	Print(10, 20);
          	Print(10, 20, 30);
          	return 0;
          }
          
          	cout 
          	cout 
          	Print(, 20 ,);
          	Print(, , 30);
          	return 0;
          }
          }
          //注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
          
          	typedef struct Stack
          	{
          		int* _a;
          		int _top;
          		int _capacity;
          	}ST;
          	void StackInit(ST* st)
          	{
          		st-_a = NULL;
          		st-_capacity = 0;
          		st-_top = -1;
          	}
          }
          
          	typedef struct Stack
          	{
          		int* _a;
          		int _top;
          		int _capacity;
          	}ST;
          	// 缺省值为4,默认开四个int大小空间
          	// 若显示传参,那么则开参数个int大小的空间
          	void StackInit(ST* st, int N = 4)
          	{
          		st-_a = (int*)malloc(sizeof(int) * N);
          		st-_capacity = N;
          		st-_top = 0;
          	}
          	void StackPush(ST* st, int x)
          	{
          		// ...
          		// 入栈操作在栈中有详细讲解,这里省略
          	}
          };
          int main()
          {
          	// 需要入栈5个数据
          	aj::ST st1;
          	aj::StackInit(&st1, 5);
          	for (int i = 0; i 
The End
微信