C++Day01

1.综述C++

1.1 C++产生背景

C语言作为结构化和模块化的语言,在处理较小规模的程序时,比较得心应手。但是当问题比较复杂,程序的规模较大的时,需要高度的抽象和建模时,c语言显得力不从心。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object  oriented  programming)思想,这需要设计出支持面向对象的程序设计语言。Smalltalk 就是当时问世的一种面向对象的语言。而在实践中,人们发现c语言已深入人心,使用如此之广泛,以至于最好的办法,不是发明一种新的语言去取代它,而是在原有的基础上发展它。在这种情况下c++(plus plus)应运而生,最初这门语言并不叫c++而是c with class (带类的c)。

1.2 应用领域

1)应用软件(嵌入式应用)
    如果项目中,既要求效率又要建模和高度抽像,那就选择 c++。
  2)系统层软件开发
    C++的语言本身的高效。
  3)服务器程序开发
    面向对像,具有较强的抽像和建模能力。
  4)游戏,网络,分布式,云计算
    效率与建模

2.C++内容和C语言的加强

2.1 C++内容

C++就名字而言,C++完全兼容C,在基础之上增加了++,其中主要包括c 的基础语法的扩展,面向对像(继承,封装,多态),模板、STL等。
  学习C++语言的工具:
  Linux:g++编译器 后缀:cpp 比如 :hello.cpp
     g++ hello.cpp -o hello
  Windows:IDE集成开发环境(vs ,  dev-c++, qt creator等)

2.2 C语言的加强

2.1.1 namespace命名空间及输入输出

C++命名空间基本常识:所谓namespace(关键字),是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

一 头文件区别 :

和<iostream.h>格式不一样,前者没有后缀,后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,
  1)当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命
名空间,也就是早期的c++实现;
  2)当使用的时候,该头文件没有定义全局命名空间,必须
使用namespace std;这样才能正确使用cout。

二 由于namespace的概念,

使用C++标准程序库的任何标识符时,可以有三种选择:
  1)直接指定标识符。例如std::ostream而不是ostream。完整语句如下:比如:
  std::cout << std::hex << 3.4 << std::endl;
  2)使用using关键字。
   using std::cout;
   using std::endl;
   using std::cin;
  以上程序可以写成 :
   cout<< std::hex << 3.4 << endl;
  3)最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout <<hex << 3.4 << endl;因为标准库非常的庞大,所以程序员在选择的类的名称或函数名 时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问 题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了<iostream.h> 和等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"。C++输入输出标准输入流(cin):预定义的对象 cin 是 iostream 类的一个实例。cin 对象附属到标准输入设备,通常是键盘。cin 是与流提取运算符 >> 结合使用。
如下所示:
  int a;
  float b;
  cout<<"a = ";
  cin >>a;
  cout << "b = ";
cin>> b;
  标准输出流(cout):预定义的对象 cout 是 iostream 类的一个实例。cout 对象"连接"到标准输出设备,通常是显示屏。cout 是与流插入运算符 << 结合使用。如下所示:
  cout<<”a= ” << a << ”b = ” << b << endl
带换行符的结束:endl

2.1.2 C++命名空间定义以及使用方法

在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突。
标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。std是c++标准命名空间,c++标准程序库中的所有标识符都被定义在std中,比如标准库中的类iostream、vector等都定义在该命名空间中,使用时要加上using声明(using namespace std) 或using指示(如std::string、std::vector).

C中的命名空间 C++中的命名空间
在C语言中只有一个全局作用域 命名空间将全局作用域分成不同的部分
C语言中所有的全局标识符共享同一个作用域 不同命名空间中的标识符可以同名而不会发生冲突
标识符之间可能发生冲突 命名空间可以相互嵌套
全局作用域也叫默认命名空间

C++命名空间的定义:
//自定义命名空间

namespace spaceA 
{
 int val_a;
 int val_b;

    namespace spaceB //在命名空间中嵌套命名空间
    {
            int b;
    }
}

//using namespace spaceA;
using spaceA::val_a;  //声明一个成员变量在哪 一个命名空间中
using spaceA::val_b;

//using namespace spaceA::spaceB;
using  spaceA::spaceB::b;
int main(void)
{
    //spaceA::val_a = 10;
    val_a = 20;
    val_b = 10;
    cout << "val_a = " << val_a << endl;

    //spaceA::spaceB::b = 50;
      b = 50;
    return 0;
}

2.1.2 C++对C语言的增强

  • 实用性增强

在c++中,声明变量的位置是比较随意,在定义的时候就直接声明;而在C语言,要求统一放在函数最前面

  • 语法检测性增强
int g_val;
int g_val = 10; //error 同名的变量只允许一个
int main()
{

    return 0;
}
  • 对于struct(结构体)的处理方式

在C语言中,对struct是把它当作一个集合,使用时,要加struct在C++中,对于struct是把它当作一个类型—类,该类中的成员都是公开的

  • 对三目运算符

在c语言中,三目运符(a>b?a:b) 返回的是一个字面上的量,所以不能左值 (a>b?a:b) = 10; //在C++中,三目运算符是可以做左值,是因为三目运算符判断返回的是一个变量

  • 对于const

对于C 而言,const是一个只读变量,且分配空间
对于C++而言: const修饰的变量为一个常量,有可能没有分配空间


const int d = 10;//   在使用const修饰变量时,一定要初始化
   int* p = (int*)&d; //   p = 10  临时在栈上分配一个空间(temp变量) int* p = &temp; temp = 20
   *p = 20;           // *p ----> temp ----> 20
   cout << "d = " << d << endl;
//*p = 20; 在C++中,由const修饰的变量,为常量,并且它可能分配空间,也可能不分配空间,是放在一个符号表中

const与#define相同和区别

相同:

const int i = 2; //全局常量
const int j = 3;
作用相当 于 #define
int array[i+j] = {0};

     for(int k=0;k<(i+j);k++)
     {
         cout << "array["<< + k << "]" << array[k]<< endl;
     }

区别:

   #define  ARRAY_SIZE 5  发生在预处理时,只做简单的文本替换
   const:发生在编译时,这个时候,编译器就确定它为一个常量,会进行一些语法检测

c++面试题:谈C 和 C++中的const,并且const跟#define有什么区别

  • 枚举
    在C语言中,枚举就是一个整型的常量,初始化时,可以直接使用整型的值
enum paly
{
   UP, //0
   DOWN, //1
   LEFT,
   RIGHT
};   

enum paly select = UP; //在C++中,对枚举类型变量初始化,只能是枚举中定义的变量来进行初始化,默认值也是从零开始
cout << “select” << select << endl;

总结:

1)输入输出是以流的形式进行 ----- #include
2)命令空间(namespace)
定义 :
namespace spaceA(名字){
int a;
}
使用:通过::(域操作符)
using namesapce spaceA; ---->using 叫作指示符
using spaceA::a -----> using 表示声明
思考:
namespace spaceA{
int a; //属于spaceA
}
int a = 10; //全局的作用域

int main()
{

int a = 20; //局部变量

//打印出三个a 的值
cout << "a= " << ::a << "a == " << a << endl;
return 0;

}
3)const
在 C语言中,只读变量
在C++中,是真正的常量,该关键字修饰的变量是否占内存,要根据具体的情况来定
const 修饰的变量是放在一个符号表中,通过key-vauel来对应,所以它是一个真正的常量,可以实现#define的作用

猜你喜欢

转载自blog.csdn.net/qq_40862304/article/details/85268685