一、C++语言概述
1 历史背景
1)C++的江湖地位java、C、C++、python、C#
2)C++之父:Bjarne Stroustrup(1950--)
1979,Cpre,为C语言增加类的机制
1983,发布全新编程语言 C with class,后来命名为C++
1985,CFont1.0 《The C++ Programming Language》
3)C++发展过程
1987,GNU C++
1990,Borland C++(BC编译器)
1992,Microsoft C++(VC编译器)IBM C++ ...
1998,ISO C++98
2003,对C++98进行修订,C++03
2011,ISO C++11/C++0x
2014,ISO C++14
2017,ISO C++17*
2020 C++20
2 应用领域
1.游戏开发
2.科学计算
3.网络通信(ACE)
4.操作系统和设备驱动
5)其它...
3 C和C++
1)都是编译型语言
2)都是强类型语言,但是C++更强
3)C++很大程度上兼容C,但是去掉了C中一些不好的特性
4)C++增加许多C中不具备的好的特性,比C程序更适合大型软件的开发
二 第一个C++程序
1 编译方式
1)gcc xx.cpp -lstdc++
2)g++ xx.cpp //推荐
2 文件扩展名
1).cpp //推荐
2).cxx
3).cc
4).C
3 头文件
//包含标准C++中所有和I/O相关的类型、对象和函数
#include<iostream>
注:在C++中标准C的头文件依然可以使用
#include<stdio.h>==> #<cstdio>
#include<stdio.h>==> #include<cstdlib>
#include<stdio.h>==> #include<cstring>
...
4 标准输入和输出
1)cin对象表示标准输入//类似scanf
eg:
int num;
scanf("%d",&num);//c中
cin >> num;//c++中
其中“>>”称为提取操作符
----------------------------
int i;
double d;
scanf("%d%lf",&i,&d);//C
cin >> a >> d;//C++
2)cout对象表示标准输出//类似printf
eg:
int num = 1234;
printf("num=%d\n",num);//C
cout << "num=" << num << endl;//C++
其中"<<"称为插入操作符
注:endl==>“\n”
----------------------------------
int i = 100;
double d = 3.14;
printf("%d,%lf\n",i,d);
cout << i << ',' << d << endl;
5 "std::"标准名字空间
C++标准库中的所有函数、变量、类型都是在std空间中
三 名字空间(namespace)
1 名字空间作用
1)避免名字冲突
2)划分逻辑单元
2 定义名字空间
namespace 名字空间{
名字空间成员1;
名字空间成员2;
...
名字空间成员n;
}
注:名字空间成员可以是全局变量、函数、类型、名字空间
eg:
namespace ns1{
int num = 100;
void func(...){...}
struct Student{...};
namespace ns2{...};
}
3 名字空间成员的使用
1)通过作用域限定操作符 "::"
空间名::要访问的成员;
eg:
int main(void){
//空间里面成员不能直接访问
//cout << num << endl;//error
//通过“::”访问空间里面的成员
cout << ns1::num << endl;//ok
}
2)名字空间指令
using namespace 名字空间名;
在该条指令以后的代码中,指定名字空间中的成员都可见,可以直接访问,省略"空间名::".
常用场景:using namespace std;
以后在使用标准名字空间里面的成员可以省略"std::"
eg:
int main(void){
using namespace ns1;//名字空间指令
cout << num << endl;//ok
}
3)名字空间声明
using 名字空间名::名字空间成员;
将名字空间中特定的一个成员引入当前作用域,在该作用域访问这个成员就如同访问局部的成员一样,可以直接访问,省略“空间名::”。
eg:
int main(void){
using ns1::num;//名字空间声明
cout << num << endl;//ok
}
4 无名名字空间
不属于任何名字空间的标识符,将被编译器自动的放入无名名字空间中,无名空间里面的成员正常可以直接访问,但是当无名空间的成员和局部的标识符名字一样时,局部优先,这时如果还希望访问无名空间的成员,可以使用作用域限制操作符:"::要访问的成员"。
5 名字空间嵌套//了解
eg:
namespace ns1{
int num = 100;
namespace ns2{
int num = 200;
namespace ns3{
int num = 300;
}
}
}
cout << ns1::num << endl;//100
cout << ns1::ns2::num << endl;//200
cout << ns1::ns2::ns3::num << endl;//300
四 C++的结构体、联合体、枚举
1 C++结构体
1)定义结构体变量可以省略struct关键字
2)在C++结构体中可以直接定义函数,称为成员函数(方法),在成员函数中可以直接访问其它成员.
eg:
struct Student{...};
struct Stduent s;
typedef struct Stduent STU;
STU s2;
-------------------
struct Student{...};
Student s;
2 联合体//了解
1)定义联合体变量可以省略union关键字
2)支持匿名联合
3 枚举
1)定义枚举变量时enum关键字可以省略
2)C++中枚举类型不能当做整型数直接来用
eg:
0 --> RUN
1 --> SLEEP
2 --> STOP
enum STATE{RUN,SLEEP,STOP};
/*enum*/ STATE s;
s = 1;//C:ok C++:error
s = SLEEP;//C:ok C++:ok
五 字符串
1 回顾C中的字符串
1)双引号常量字符串: "hello"
2)字符指针:char*
3)字符数组:char[]
2 C++中兼容C的字符串的同时,增加了string类型专门表示字符串。
1)定义字符串
string s;//定义一个空字符串
string s = "hello";//定义字符串同时初始化
//下面两种写法和上面写法等价
string s = string("hello");
string s("hello");
2)字符串拷贝: =
string s1 = "hello";
string s2 = "jiangguiliang";
s1 = s2;//拷贝
cout << s1 << endl;//"jiangguiliang"
3)字符串连接:+ +=
string s1 = "hello";
string s2 = " world";
string s3 = s1 + s2;
cout << s3 << endl;//hello world
s1 += s2;//s1 = s1 + s2;
cout << s1 << endl;//hello world
4)字符串比较:== != > < >= <=
string s1 = "hello";
if(s1 == "hello"){//1:逻辑真
...
}
if(s1 > "Jiangguiliang"){//1:逻辑真
...
}
5)获取字符串中某个字符: []
string s1 = "hello";
cout << s1[0] << endl;//'h'
s1[0] = 'H';
cout << s1 << endl;//Hello
6)string类型中常用的成员函数
size()/length() :获取字符串的长度
c_str() :将string转换为C中const char*字符串
string s = "hello";
s.size();//5
s.length();//5
const char* p = s.c_str();