C++学习-初识篇

C++起源史

C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(**Template)常(Exception)、RTTI命名空间(Name Space)逐渐被加入标准

C++和C语言的关系:

C是C++的子集,C++兼容C的特性。

C++是C语言的继承,进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。

和C的区别

1、数据类型

  在C语言中数据类型主要分为基本类型、构造类型、指针类型、空类型。

基本类型:整型 int、字符型 char、实型(单精度 float、双精度double)
构造类型:数组类型、结构类型 struct、联合类型 union、枚举类型 enum
指针类型
空类型:void
  而在C++中 ,除了以上类型之外,另外新增了布尔类型 bool,其值为true或者flase,还引入了类的结构类型。

2、初始化方法

  C语言中,变量初始化的方法为复制初始化,如:

int x = 100//复制初始化

  C++中,另外增加一种初始化方法为直接初始化,如:
  

int x(100);   //直接初始化

  
3、变量的定义

  在C语言中,变量的定义要在函数的前面,即当函数中使用到一个新的变量时,要将该变量定义在函数的前面;而在C++中,变量可以随用随定义,如:
  

for(int i = 0; i < 10; i++)  //随用随定义

4、输入输出

  C语言中,输入输出方法如下:

int n;
scanf("%d",&n);   //利用scanf输入
printf("%d\n, n");   //利用printf输出

 C++中,输入输出方法如下:

int n;
cin>>n;         //利用cin输入
cout<<n<<endl;  //利用cout输出

  可以看到,C++中的输入输出不再关心待输入输出的数据类型,更加简单方便。

  需要注意的是,在C++中若有输入输出,需添加头文件:
  

#include<iostream>

另外,需要说明,cin和cout是命名空间std下的函数,即:

using namespace std;

5、命名空间

  C++中添加了命名空间这个概念,通俗来讲,命名空间就是为变量和函数创建一个自己的空间,当不同的程序员开发的源代码中使用相同名称的变量和函数时,主函数能够正确地调用自己需要的函数。
  

#include <iostream>  //IO流
#include <stdio.h>  //标准输出
using namespace std;  //命名空间,隔离名字,防止命名冲突,
                        //c++所有空间默认std命名空间

namespace my //自定义域my
{
    int a=12; 
    namespace one //自定义my域里面嵌套one域
    {
        int c=200;
    }

}
namespace you //自定义you域
{
    int a=1; 

}
using namespace you; //将自定义域名变成全局变量

int a=100;//定义全局变量

int main()
{
    int a=10;  //定义局部变量

    printf("局部变量a=%d\n",a);
    printf("全局变量a=%d\n",::a); 
    printf("my域a=%d\n",my::a);
    printf("you域a=%d\n",you::a);
    printf("my域嵌套c=%d\n",my::one::c);
    return 0;
}

运行结果如下

[zyc@localhost lesion1]$ ./a.out 
局部变量a=10
全局变量a=100
my域a=12
you域a=1
my域嵌套c=200

总结:
1:当自定义域变成全局变量时且本来已经定义全局变量,访问全局变量时,优先级:
全局变量高于自定义全局变量

2:如果没有指定命名空间,需要在输出时指定变量域

#include<iostream>
#include <stdio.h>
//using namespace std;//直接展开
int max=100;
int main()
{
    printf("%d\n",max);
    printf("%d\n",std::max(1,2));//直接指定输出域
    return 0;
}

6:C++自动识别类型(但会发生截断)

#include<iostream>
#include <stdio.h>
using namespace std;
int main()
{
    double d=1.11111111;

    cout<<"c++环境d="<<d<<endl;
    printf("C环境下d=%lf\n",d);
    return 0;
}

运行结果

c++环境d=1.11111
C环境下d=1.111111

总结:在C语言中,默认截断位数为6位,在C++中,默认截断5位。并且输出不需要指定类型。

7:C++函数重载(C++特有)

1)函数重载定义:

在同一个作用域中,如果有多个函数的名字相同,但是形参列表不同(参数类型不同或参数个数不同),返回值类型可同也可不同,我们称之为重载函数。

重载的函数是通过形参列表区分的,与返回值类型无关。函数重载其实是”一个名字,多种用法”的思想,不仅函数可以重载,运算符也可以重载。

2)函数重载过程

详细过程见下面这篇博客
https://blog.csdn.net/gogogo_sky/article/details/72807123#0-qzone-1-40789-d020d2d2a4e8d1a374a433f596ad1440

8:缺省参数(备胎)

定义:在函数定义或创建时,给形参一个默认的参数,这样即使在调用函数时即使没有给函数实参,函数就默认刚才设置的形参。

规则

1)缺省只能 从右往左缺省。
2)缺省值必须为常量或全局变量 (const/static/普通的 全局变量 也可以作为缺省参数)

3)缺省参数只能出现在声明或者定义的一处
4)不能把 const的全局变量 作为缺省值
5)缺省值不构成函数重载,缺省值并没有赋予函数新的功能

如下:

#include<iostream>
using namespace std;
//缺省:全缺省,半缺省(从右往左连续缺省)
int Add(int a=1,int b=2)
{
    return a+b;
}
int main()
{
    cout<<Add(3,4)<<endl; //有实参,直接使用实参值
    cout<<Add(6)<<endl;//半缺省参数,另外一个形参默认b=2
    cout<<Add()<<endl;//全缺省参数,默认a=1,b=2
    return 0;
}

运行结果:

[zyc@localhost lesion1]$ ./a.out 
7
8
3

特别提醒:

(1)凡是出现利用缺省参数值作if判断,并且判断后实现代码完全不同的,都应该分拆成两个独立的函数。

猜你喜欢

转载自blog.csdn.net/zgege/article/details/80873409