【C++】初识C++

2024-06-08 1908阅读

【C++】初识C++

  • 文章概括
  • 关键字(C++98)
  • 命名空间
    • 命名空间的定义
    • 命名空间的特性
    • 输入与输出
      • C++中的输入输出
      • 输入输出的命名空间
      • 缺省参数
      • 函数重载
      • 引用
        • 引用的概念
        • 引用的特性
        • 引用地使用场景
          • 引用做参数
          • 引用做返回值
          • 常引用
            • 常引用的俩个例子
            • 引用与指针的区别
            • 内联函数

              文章概括

              谈谈C++在学习前的认知,C++是在C的基础上,容纳进去了面向对象的编程思想,并增加了许多有用的库,以及编程范式等等。所以学习C++之前一定对C有一定的认知,一个好的C++程序员一定会是一个优秀的C语言程序员。

              本章主要介绍:补充C语言语法的不足,以及C++是如何对C语言程序设计不合理地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等等;同时也为后续学习类和对象做了铺垫。

              关键字(C++98)

              C++有63个关键字,C语言有32个关键字。

              关键字关键字关键字关键字关键字
              asmautoboolbreakcase
              catchcharclassconstconst_cast
              deletedodoubledynamic_castelse
              enumexplicitexportexternfalse
              floatgotoifinlineint
              longmutablenamespacenewoperator
              privateprotectedreinterpret_castreturnshort
              signedsizeofstaticstatic_casestruct
              switchtemplatethistrytypedef
              typeidtypenameunionunsignedusing
              virtualvoidvolatilecontinuefor
              publicthrowwchar_tdefaultfriend
              registertruewhile

              后续逐渐了解

              命名空间

              命名空间的定义

              先以C语言举例:

              假设需要定义一个全局变量随机数random为10

              #include
              int rand = 10;
              int main(void)
              {
              	printf("%d\n", rand);
              	return 0;
              }
              

              【C++】初识C++

              这是可以编译成功的,但是我们之前有了解过rand是一个头文件stdlib.h的一个库函数,如果我们包含stdlib.h这个头文件会发生什么?

              #include
              #include
              int rand = 10;
              int main(void)
              {
              	printf("%d\n", rand);
              	return 0;
              }
              

              【C++】初识C++

              发生报错,这里可以明显突出一个C语言的库命名冲突问题。

              有时在一个大的工程中有多个项目,每个项目会由不同的人负责,这时也会难免遇到项目之间的命名问题。

              总之,C语言命名冲突的问题有:

              1.库命名冲突问题

              2.项目相互之间命名的冲突

              在C++中,存在命名空间namespace可以解决这类型的问题。

              在讲解命名空间前,需要先了解域的概念:域可以看作是一个作用区域,域包含类域、命名空间域、局部域、全局域等等

              在一般情况下访问时,会先访问局部域,在局部域中未发现变量,会进而访问全局域。

              【C++】初识C++

              【C++】初识C++

              假设在全局域中存在全局变量,同时在局部域中也存在一个局部变量,但是想要跳过局部域直接访问全局域,应该如何操作?

              int a = 1;
              int main(void)
              {
              	int a = 0;
              	printf("%d\n", ::a);
              	return 0;
              }
              

              【C++】初识C++

              这里需要介绍一个操作符"::",域操作限定符,::a默认会跳过局部域,访问全局域。

              那如果存在命名空间域namespace,其优先级是如何?

              int a = 1;
              namespace project
              {
              	int a = 2;
              }
              int main(void)
              {
              	int a = 0;
              	printf("%d\n", a);
              	printf("%d\n", ::a);
              	return 0;
              }
              

              【C++】初识C++

              【C++】初识C++

              【C++】初识C++

              由此可见,访问变量a,会先访问局部域——>然后访问全局域——>最后在默认情况下,编译器并不会主动去命名空间域搜索。

              想要搜索命名空间域,有俩种方式:

              1.展开命名空间域

              namespace project
              {
              	int a = 2;
              }
              using namespace project;
              int main(void)
              {
              	printf("%d\n", a);
              	return 0;
              }
              

              【C++】初识C++

              2.指定访问命名空间域

              namespace project
              {
              	int a = 2;
              }
              int main(void)
              {
              	printf("%d\n", project::a);
              	return 0;
              }
              

              【C++】初识C++

              如果在局部域,全局域,命名空间域(展开命名空间域)中都存在变量a,会如何访问?

              【C++】初识C++

              【C++】初识C++

              这里可以发现局部域的优先级最高,但如果只存在全局域与展开后命名空间域时,会发生报错,原因在于:展开的命名空间域相当于暴露在全局域。

              所以不要轻易使用using namespace + 名,即不要请轻易展开命名空间域。

              总结:在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

              命名空间的特性

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

                1.命名空间域中可以定义变量、函数、类型

                namespace project
                {
                	//定义变量
                	int num = 10;
                	//定义函数
                	int add(int x, int y)
                	{
                		return x + y;
                	}
                	//定义结构体
                	struct Node
                	{
                		struct Node* next;
                		int data;
                	};
                }
                

                2.命名空间可以嵌套

                namespace project
                {
                	namespace N1
                	{
                		int a = 1;
                	}
                	namespace N2
                	{
                		int a = 2;
                	//定义函数
                	int add(int x, int y)
                	{
                		return x + y;
                	}
                	}
                }
                int main(void)
                {
                	printf("%d ", project::N1::a);
                	printf("%d ", project::N2::a);
                	printf("%d ", project::N2::add(1,2));
                	return 0;
                }
                

                【C++】初识C++

                【C++】初识C++

                • std是C++标准库的命名空间名,C++将标准库的定义实现都放在这个命名空间里。

                  【C++】初识C++

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

                  3.同一个工程中允许存在多个相同的命名空间,编译器最后会合成同一个命名空间,即可以在多个文件中定义相同名字的命名空间

                  【C++】初识C++

                  【C++】初识C++

                  【C++】初识C++

                  【C++】初识C++

                  输入与输出

                  C++中的输入输出

                  早年在VC6.0时没有命名空间,头文件C++中的头文件

                  #include
                  

                  后面改为了

                  #include
                  #include
                  #include
                  

                  使用iostream这个头文件时,需要先学习C++的输入输出.

                  c语言中使用printf与scanf来将数据输出与输入,而在C++中使用cout与cin实现输入输出。

                  #include
                  using namespace std;
                  int main(void)
                  {
                  	int a;
                  	cin >> a;
                  	cout 
                  	std::cout 
                  	cout 
                  	cout 
                  	int* newnode = (int*)malloc(sizeof(int) * sz);
                  	if (newnode == NULL)
                  	{
                  		perror("malloc fail");
                  		return;
                  	}
                  	node = newnode;
                  }
                  int main(void)
                  {
                  	int* node;
                  	//默认情况下,初始化4个字节
                  	Init(node);
                  	//可以指定实参,初始化100个字节
                  	Init(node, 100);
                  	return 0;
                  }
                  
                  	return a + b + c;
                  }
                  int main(void)
                  {
                  	int sum = RetAdd();
                  	cout 
                  	return a + b + c;
                  }
                  int main(void)
                  {
                  	int sum = RetAdd(1,2);
                  	cout 
                  	return a + b;
                  }
                  double RetAdd(double a, double b)
                  {
                  	return a + b;
                  }
                  int main(void)
                  {
                  	cout 
                  	cout 
                  	cout 
                  	Fun();
                  	Fun(1);
                  	return 0;
                  }
                  
                  	return a + b;
                  }
                  double RetAdd(double a, int b)
                  {
                  	return a + b;
                  }
                  int main(void)
                  {
                  	cout 
                  	int a = 10;
                  	int& b = a;
                  	int& c = b;
                  	int& d = a;
                  	printf("%p\n", &a);
                  	printf("%p\n", &b);
                  	printf("%p\n", &c);
                  	printf("%p\n", &d);
                  	return 0;
                  }
                  
                  	int a = 0;
                  	int* pa = &a;
                  	int** ppa = &pa;
                  	printf("%p\n", &a);
                  	printf("%p\n", pa);
                  	printf("%p\n", *ppa);
                  	return 0;
                  }
                  
                  	int a = 10;
                  	int& b = a;
                  	int& c = a;
                  	int& d = a;
                  	return 0;
                  }
                  
                  	int a = 10;
                  	int x = 20;
                  	int& b = a;
                  	b = x;
                  	cout 
                  	int data;
                  	struct ListNode* next;
                  }PNode;
                  void LTPushBack(PNode* p, int x);
                  
                  	int data;
                  	ListNode* next;
                  	//在C++中可以不写struct
                  }*PNode;
                  void LTPushBack(PNode& p, int x);
                   int a[100000]; };
                  void TestFunc1(A a) {}
                  void TestFunc2(A& a) {}
                  void TestRefAndValue()
                  {
                  	A a;
                  	// 以值作为函数参数
                  	size_t begin1 = clock();
                  	for (size_t i = 0; i 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]