namespacestructenumunionstring(day01)

Kernel001 Kernel001     2022-09-24     380

关键词:

一 C++概述
1 C++历史背景
1)C++的江湖地位
 jave C C++ C# python

2)C++之父:Bjarne Stroustrup(1950--)
1979,Cpre,为C语言增加类的机制
1983,Bjarne发布了全新的编程语言C with Class
1985,CFront1.0《The C++ programming Language》

3)C++发展过程
1987,GNU C++
1990,Borland C++(BC编译器)
1992,Microsoft C++(VC)
1998,ISO C++98
2003,对C++98进行修订,C++03
2011,ISO C++11/C++0x
2014, ISO对C++标准做了部分扩展,C++14
*2017,C++17(未知)

2 应用领域
1)游戏
2)科学计算
3)网络通信(ACE)
4)操作系统和设备驱动
5)其它...

3 C和C++
1)都是编译型语言
2)都是强类型语言,但是C++更强
3)C++兼容C语言,但是去除了C中不好的特性
4)C++增加了很多了好的特性,比C语言更适合大型软件的开发

二 第一个C++程序
1 编译方式
1)gcc xx.cpp -lstdc++
2)g++ xx.cpp //good

2 文件扩展名
1)xx.cpp//good
2)xx.cc
3)xx.cxx
4)xx.C

3 头文件
//包含标准C++中所有和I/O有关的类型、对象、函数
#include <iostream> 

//在C++中依然可以使用C库的函数,但需要写上对应的有文件,C++中提供了一套和C库对应的头文件
#include <stdio.h> ==> #include <cstdio>
#include <stdlib.h> ==> #include <cstdlib>
#include <string.h> ==> #include <cstring>
...

4 标准输入和输出
1)用cin对象表示标准输入//类似scanf
eg:
   //从标准输入设备获取一个整形数放到变量a中
   int a;
   scanf("%d",&a);
   cin >> a;
   ">>" 称为提取运算符
eg:
   int a;
   double d;
   scanf("%d%lf",&a,&d);
   cin >> a >> d;
   
2)用cout对象表示标准输出//类似printf
eg:
   int a = 100;
   printf("%d
",a);
   cout << a << endl;
   "<<":称为插入运算符
   注:endl表示换行,和“
”等价
eg:
   int a = 10;
   double d = 3.14;
   printf("%d,%lf
",a,d);
   cout << a << , << d << endl;   

5 "std::"表示标准名字空间

三 名字空间(namespace)
1 名字空间的作用
1)避免名字冲突
2)划分逻辑单元

2 定义名字空间
namespace 名字空间名{
    名字空间成员1;
    名字空间成员2;
    ...
}
名字空间成员可以是全局变量、全局函数、类型、名字空间。
eg:
namespace ns{
    int i;//全局变量
    void func(void){...}//全局函数
    struct Stduent{...};//结构体类型
    namespace ns2{...}
}

3 名字空间成员使用
1)通过作用域限定运算符“::”
  名字空间名::要访问的成员;
  eg:
  namespace ns{
    int i;//全局变量
  }
  int main(void){
     i=100;//error,名字空间里面成员不能直接访问
     ns::i=100;//ok,通过作用域限定符可以访问
  }
2)名字空间指令
  using namespace 名字空间名;
  在该条指令以后的代码,指定名字空间中的成员都可见,访问其中的成员可以省略作用域限定。

3)名字空间声明
  using 名字空间名::名字空间成员;
  将名字空间中的某个成员引入当前作用域,在该作用域访问这个成员如果访问局部变量一样,可以省略作用域限定.
eg:
  namespace ns{
     int i1=10;
     int i2=20;
  }
  int main(void){
      using namespace ns;//名字空间指令
      cout << i1 << endl;//ok
      cout << i2 << endl;//ok
      ---------------------------
      using ns::i1;//名字空间声明
      cout << i1 << endl;//ok
      cout << i2 << endl;//error
  }
4 无名名字空间
  不属于任何名字空间的标识符,将被编译器划分到无名名字空间中,显式访问里面的成员:"::成员"5 嵌套名字空间//了解
eg:
  namespace china{
      namespace beijing{
           namespace chaoyang{
                  char* name;
           }
      }
  }
  china::beijing::chaoyang::name = "老王";
  
四 C++结构体、联合体和枚举
1 C++结构体
1)定义结构体类型变量时可以省略“struct”关键字
eg:
  struct A{...};//声明
  A a;//定义结构体类型的变量a
2)在C++结构体里面可以直接定义函数,称为成员函数,而且在成员函数中可以直接访问成员变量;
eg:
  struct A{
      int a;//成员变量
      void foo(void){...}//成员函数
  };
  
2 联合体 //了解
1)定义联合体类型变量时可以省略“union”关键字
2)支持匿名联合

3 枚举
1)定义枚举类型变量时可以省略“enum”关键字
2)C++枚举是一种独立的数据类型,而C中枚举本质就是整型数。
eg:
  enum COLOR{RED,GREEN,BLUE};
  /*enum*/COLOR c;
  c = 100;//C:ok C++:error

五 C++的字符串
1 C++兼容C中字符串表示方式
1)字面值常量字符串 "hello"
2)字符指针 char*
3)字符数组 char[]
eg:
  const char* p = "hello";
  //strcpy(p,"world");//段错误
  p = "world";//ok
  
  char arr[5]={0};
  strcpy(arr,"jiangguliang");//越界使用内存危险
  cout << arr << endl; 
  
  //arr-->char* const arr
  //arr = "hello";//error
2 C++中增加string类型,专门表示字符串
1)定义字符串
  string s;//定义空字符串
  string s1 = "hello";//定义同时初始化
  string s2("hello");
  string s3 = string("hello");
  注:s1 s2 s3三种写法完全等价
2)字符串的基本操作
--》字符串拷贝"="
--》字符串的连接"+" "+="
--》字符串比较: > < == !=
--》获取字符串中某个字符:[]
--》获取字符串的长度:size()/length()
--》将string转换成char*: c_str()
eg:
  string s1 = "hello";
  s1 = "abcdefg";//拷贝字符串
  cout << s1 << endl;//abcdefg
  ------------------------------
  string s1 = "hello";
  s1 += " world";//把world连接到s1后面
  cout << s1 << endl;//"hello world"
  ------------------------------
  string s1 = "hello";
  string s2 = s1 + " world";
  cout << s2 << endl;//"hello world"
  ------------------------------
  string s1 = "hello";
  string s2 = "world";
  if(s1 > s2){//字符串比较
      cout << "s1>s2" << endl;
  }
  else{
    cout << "s1<s2" << endl;
  }
  ------------------------------
  string s1 = "hello";
  //获取字符串中某个字符
  cout << s1[0] << endl;//h
  s1[0] = H;
  cout << s1 << endl;//Hello
  ------------------------------
  string s1 = "hello world!";
  cout << s1.size() << endl;//12
  cout << s1.length() << end;//12
  -----------------------------
  string s1 = "hello";
  char* s2 = s1;//error
  char* s2 = s1.c_str();//ok
  
  
=====================
练习:使用string表示字符串,从键盘读取一个字符串,统计里面包含字母A/a的个数.
string s;
cin >> s;//注:会被空白字符截断
getline(cin,s);//它可以读走空格