一 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);//它可以读走空格