C++入门(1)

本文介绍了C++中面向对象编程的概念,包括C++对C语言的扩展,补充语法,如作用域优化、命名空间的使用、C++关键字、输入输出机制(包括cout/cin和命名空间std),以及函数重载和缺省参数的概念。
摘要由CSDN通过智能技术生成

0.知识点安排目的   

                C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对 C++学习有一定的帮助,本章节主要目标:
                
                        1. 补充C语言语法的不足,以及 C++ 是如何对 C 语言设计不合理的地方进行优化的,比如:作用 域方面、IO 方面、函数方面、指针方面、宏方面等。
                        2. 为后续类和对象学习打基础;

1. C++关键字(C++98)        

 

                C++总计63 个关键字,C语言32个关键字(可以看到许多我们在c语言中已经见过)
ps :下面我们只是看一下 C++ 有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再
细讲;

 2. 命名空间        

                在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名
称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本
地化 ,以避免命名冲突或名字污染 namespace 关键字的出现就是针对这种问题的。
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决

int main()
{
 printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

2.1 命名空间定义        

                定义命名空间,需要使用到namespace关键字 ,后面跟 命名空间的名字 ,然 后接一对 {} 即可, {} 中即为命名空间的成员。
        上述问题我们就可以用下面的代码解决;
namespace space
{
	int rand = 10;
}


int main()
{
	printf("%d ", space::rand);

	return 0;
}
命名空间中可以定义变量/函数/类型
namespace myspace
{
 // 命名空间中可以定义变量/函数/类型
     int rand = 10;


     int Add(int left, int right)
     {
         return left + right;
     }


     struct Node
     {
         struct Node* next;
         int val;
     };
}
命名空间可以嵌套
namespace N1
{
    int a;
    int b;

    int Add(int left, int right)
    {
         return left + right;
     }

    namespace N2
     {
         int c;
         int d;
         int Sub(int left, int right)
         {
             return left - right;
         }
     }
}
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
一个工程中的比如 test.h test.cpp 中两命名空间 N1 会被合并成一个;
         注意: 一个命名空间就定义了一个新的作用域 ,命名空间中的所有内容都局限于该命名空间中。

2.2 命名空间使用

        命名空间中成员该如何使用呢?比如:

namespace bit
{
 // 命名空间中可以定义变量/函数/类型
     int a = 0;
     int b = 1;
     int Add(int left, int right)
     {
         return left + right;

     }
     struct Node
     {
         struct Node* next;
         int val;
     };
}


int main()
{
 // 编译报错:error C2065: “a”: 未声明的标识符
 printf("%d\n", a);
return 0;
}
命名空间的使用有三种方式:
        
        加命名空间名称及作用域限定符 ::
int main()
{
    printf("%d\n", N::a);
    return 0;    
}

        使用using将命名空间中某个成员引入

using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;    
}

        使用using namespace 命名空间名称引入

using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}

3. C++输入&输出

我们来看C++如何实现hello world;

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
    cout<<"Hello world!!!"<<endl;
    return 0;
}

对于上面的代码,我们有如下说明:        

        1. 使用 cout 标准输出对象 ( 控制台 ) cin 标准输入对象 ( 键盘 ) 时,必须 包含 < iostream > 头文件
以及按命名空间使用方法使用 std
        
        2. cout和 cin 是全局的流对象, endl 是特殊的 C++ 符号,表示换行输出,他们都包含在包含 <
iostream > 头文件中。
        3. << 是流插入运算符, >> 是流提取运算符;
        
        4. 使用 C++ 输入输出更方便,不需要像 printf/scanf 输入输出时那样,需要手动控制格式(%d %f  %s  %c)。C++的输入输出可以自动识别变量类型;
        
        5. 实际上 cout cin 分别是 ostream istream 类型的对象, >> << 也涉及运算符重载等知识,
这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。
注意:早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应
头文件即可,后来将其实现在 std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,
规定 C++ 头文件不带 .h ;旧编译器 (vc 6.0) 中还支持 <iostream.h> 格式,后续编译器已不支持,因
推荐 使用 <iostream>+std 的方式。
#include <iostream>
using namespace std;
int main()
{
   int a;
   double b;
   char c;
     
   // 可以自动识别变量的类型
   cin>>a;
   cin>>b>>c;
     
   cout<<a<<endl;
   cout<<b<<" "<<c<<endl;
   return 0;
}
std 命名空间的使用惯例:
         1. 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
        
        2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型 /
/ 函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像 std::cout 这样使用时指定命名空间 +
using std::cout 展开常用的库对象 / 类型等方式。

4. 缺省参数

4.1 缺省参数概念         

                缺省参数是声明或定义函数时为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
        
void Func(int a = 0)
{
     cout<<a<<endl;
}

int main()
{
     Func();     // 没有传参时,使用参数的默认值
     Func(10);   // 传参时,使用指定的实参
    
    return 0;
}

4.2 缺省参数分类

全缺省参数
        
void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }
半缺省参数
        
void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }
注意:
        1. 半缺省参数必须 从右往左依次 来给出,不能间隔着给;( 这样可以避免函数调用时不完全传参出现歧义)
         2. 缺省参数不能在函数声明和定义中同时出现( 一般在函数声明的时候进行缺省参数
  //a.h
  void Func(int a = 10);
  
  // a.cpp
  void Func(int a = 20)
 {}
  
  // 注意:如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
用那个缺省值。

         3. 缺省值必须是常量或者全局变量;

        4. C语言不支持(编译器不支持)

5. 函数重载   

5.1 函数重载概念    

                函数重载:是函数的一种特殊情况,C++ 允许在 同一作用域中 声明几个功能类似 的同名
函数 ,这些同名函数的形参列表 ( 参数个数 或 类型 或 类型顺序 ) 不同 ,常用来处理实现功能类似数
据类型不同的问题。
#include<iostream>
using namespace std;

// 1、参数类型不同
int Add(int left, int right)
{
     cout << "int Add(int left, int right)" << endl;
     return left + right;
}

double Add(double left, double right)
{
 cout << "double Add(double left, double right)" << endl;
 return left + right;
}


// 2、参数个数不同
void f()
{
     cout << "f()" << endl;
}
void f(int a)

{
     cout << "f(int a)" << endl;
}

// 3、参数类型顺序不同
void f(int a, char b)
{
     cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
     cout << "f(char b, int a)" << endl;
}

5.2 C++支持函数重载的原理--名字修饰(name Mangling)

        为什么C++支持函数重载,而C语言不支持函数重载呢?

C/C++ 中,一个程序要运行起来,需要经历以下几个阶段: 预处理、编译、汇编、链接
以三个文件来做演示:Fun.h  Fun.cpp  test.cpp
首先来预处理:头文件的展开,宏的替换,条件编译,删除注释........
编译:检查语法,形成汇编代码;
汇编:转为二进制的机器码;
链接:合并到一起,链接一些没有确定的函数地址等。
如图:

                        简单来说就是,C语言链接的时候,以函数名来链接没有确定的函数地址,这样函数名自然不支持重载;而C++用修饰后的函数名来链接,这样即使函数相同也可以进行区分同名函数进行链接了,就支持重载了;
                        今天就到这里了,后面的内容我会持续更新,大家记得三连哦!!!
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(int*) nightfall

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值