C++基础学习笔记
1.C++基础知识
一.C++发展过程
–》1998,ISO C++98
–》2003,ISO C++03
–》2011,ISO C++11
–》2014,ISO C++14
–》2017,ISO C++17
–》2020,ISO C++20
#include <iostream>
//#include <stdio.h>//C风格
#include <cstdio>//C++风格
int main(void){
std::cout << "hello world!" << std::endl;
printf("hello world!\n");
return 0;
}
1 编译方式
1)gcc xx.cpp -lstdc++
2)g++ xx.cpp //推荐
2 文件扩展名.cpp //推荐
3 头文件
#include <iostream>
C++中和I/O相关的类型、对象、函数都在在头文件中
C++中大多数头文件没有".h"后缀
注:在C++中开发中,依然可以使用标准C库的头文件,另外在C++中还提供一套不带“.h”替换版本.
#include <stdio.h> ==> #include <cstdio>
#include <stdlib.h> ==> #include <cstdlib>
#include <string.h> ==> #include <cstring>
4 C++中标准输入和输出
1)cin对象表示标准输入//类似scanf
int num=0;
scanf("%d",&num);//C语言
cin >> num;//C++语言
注:“>>”被称为输入(提取)操作符
//从键盘同时读取一个int和一个double数据
int i=0,double d = 0.0;
scanf("%d%lf",&i,&d);//C语言
cin >> i >> d;//C++语言
2)cout对象表示标准输出//类似printf
int num = 123;
printf("%d\n",num);//C语言
cout << num << endl;//C++语言
注:“<<”被称为输出(插入)操作符
注:“endl”表示换行和"\n"类似
//同时打印输出一个int数据和一个double
int i=100,double d=1.23;
printf("%d,%lf\n",i,d);//C语言
cout << i << ',' << d << endl;//C++语言
三 命名空间
1 作用
1)避免名字冲突
2)划分逻辑单元
2 定义
namespace 名字空间名{
名字空间成员1;
名字空间成员2;
...
}
注:名字空间成员可以是全局函数、全局变量、类型、名字空间.
3 名字空间成员使用
1)作用域限定操作符"::"
名字空间名::要访问的成员;
std::cout //指定访问标准名字空间里面的cout
2)名字空间指令
using namespace 名字空间名;
注:在该条指令以后的代码中,指定名字空间的成员都可见,可以直接访问,省略"名字空间名::".
using namespace std;
cout << a;//ok
3)名字空间声明
using 名字空间名::名字空间成员;
注:将名字空间中特定的一个成员引入到当前作用域,在该作用域访问这个成员就如同访问自己的局部成员一样,可以直接访问,省略"名字空间名::"
4 全局作用域和匿名名字空间//了解
1)没有放在任何名字空间的成员属于全局作用域,可以直接访问,但如果和局部作用域的成员名字一样,局部优先;这时如果还希望访问全局作用域的成员可以通过“::xx”显式访问。
2)定义名字空间时可以没有名字,即为匿名名字空间,匿名空间中成员和全局作用域类似,可以直接访问,也可以通过"::xx"显式的访问,唯一的区别匿名空间的成员被局限在当前文件中使用。
5 名字空间的嵌套与合并//了解
1)名字空间嵌套
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
2)名字空间合并:两个同名的空间会自动合并成一个
namespace ns{//1.cpp
void func1(void){…}
}
namespace ns{//2.cpp
void func2(void){…}
}
#include <iostream>
namespace ns1{
void func(void){
std::cout << "ns1的func" << std::endl;
}
}
namespace ns2{
void func(void){
std::cout << "ns2的func" << std::endl;
}
}
int main(void){
//名字空间成员不能直接访问
//func();//error
//可以通过作用域限定符"::"访问
ns1::func();
ns2::func();
return 0;
}
#include <iostream>
//标准名字空间指令,省略“std::”
using namespace std;
namespace ns1{
void func(void){
cout << "ns1的func" << endl;
}
}
namespace ns2{
void func(void){
cout << "ns2的func" << endl;
}
}
int main(void){
using namespace ns1;//名字空间指令
func();//ns1的func
using namespace ns2;//名字空间指令
//func();//歧义错误
ns2::func();
return 0;
}
///
#include <iostream>
//标准名字空间指令,省略“std::”
using namespace std;
namespace ns1{
void func(void){
cout << "ns1的func" << endl;
}
}
namespace ns2{
void func(void){
cout << "ns2的func" << endl;
}
}
int main(void){
using ns1::func;//名字空间声明
func();//ns1的func
//using ns2::func;
//func();//歧义错误
using namespace ns2;//名字空间指令
func();//ns1的func,局部优先
ns2::func();//ns2的func
return 0;
}
#include <iostream>
using namespace std;
namespace ns1{
int num = 100;
}
namespace ns2{
int num = 200;
}
//int num = 300;//全局作用域
namespace {//匿名名字空间
int num = 300;
}
int main(void){
cout << num << endl;//300
using ns1::num;//名字空间声明
cout << num << endl;//100,局部优先
cout << ns2::num << endl;//200
cout << ::num << endl;//300
return 0;
}
四 C++的结构体、联合体和枚举
1 C++的结构体
1)当定义结构体变量时可以省略struct关键字
2)在C++的结构体内部可以直接定义函数,称为成员函数(方法),在成员函数内部可以直接访问结构体的其它成员.
#include <iostream>
using namespace std;
struct Teacher{
//成员变量
char name[20];
int age;
double salary;
//成员函数
void who(void){
cout << "我叫" << name << ",今年" <<
age <<"岁,工资是" << salary<<endl;
}
};
int main(void){
Teacher youcw={"游成伟",35,800.5};
youcw.who();
Teacher* pt = &youcw;
pt->who();//(*pt).who()
return 0;
}
2 联合体//了解
1)当定义联合体变量时可以省略union关键字
2)在C++中支持匿名联合
#include <iostream>
using namespace std;
int main(void){
union{//匿名联合
unsigned int ui ;
unsigned char uc[4];
};
ui = 0x12345678;
//如果当前是小端字节序,下面输入结果?
for(int i=0;i<4;i++){
//hex:表示以16进制方式打印整数
//showbase:显示"0x"
cout << hex << showbase << (int)uc[i]
<< endl;
}
return 0;
}
3 枚举
1)当定义枚举变量时可以省略enum关键字
2)C++中枚举被看作是独立数据类型,不能把枚举直接当做整型数来使用.
enum STATE{SLEEP=0,RUN=1,STOP=2};
/*enum*/ STATE s;
s = RUN;//C:ok C++:ok
s = 1;//C:ok C++:error
#include <iostream>
using namespace std;
int main(void){
enum Color{RED=10,BLUE,GREEN};
cout << RED << "," << BLUE << "," <<
GREEN << endl;
/*enum*/ Color c;
//c = 10;//C:ok,C++:error
c = RED;//C:ok,C++:ok
cout << c << endl;//10
return 0;
}
五 C++的字符串
1 回顾C语言中的字符串
1)字面值常量字符串: “XX”
2)字符指针:char*
3)字符数组:char[]
2 C++兼容C风格的字符串,同时增加了string类型,专门字符串:
1)定义
string s1;//定义空字符串
string s2 = “xx”;//定义同时初始化
2)字符串拷贝:=
string s1 = “youcw”;
string s2 = “mindasheng”;
s1 = s2;//将s2拷贝给s1
cout << s1 << endl;//“mindasheng”
3)字符串连接:+ +=
string s1 = “hello”;
string s2 = " world";
string s3 = s1 + s2;
cout << s3 << endl;//“hello world”
4)字符串比较:== != > >= < <=
if(s1 == s2){…}
5)随机访问: []
string s = “minwei”;
s[0] = ‘M’;
s[3] = ‘W’;
cout << s << endl;//MinWei
6)暂时可以string理解为是"结构体"类型,里面包含了很多成员函数,常用的:
size()/length();//获取字符串长度
c_str();//返回字符串的起始地址(const char*)
eg:
string str = “youcw”;
str.size();//5
str.length();//5和size()等价
string s1 = “hello”;//C++风格
const char* s2 = “world”;//C风格
s1 = s2;//ok
s2 = s1;//error
s2 = s1.c_str();
#include <iostream>
using namespace std;
int main(void){
string str;
int count = 0;
cout << "Please input a string:" << endl;
cin >> str;
for(int i=0;i<str.size();i++){
if(str[i]=='y' || str[i]=='Y'){
++count;
}
}
cout << "Y/y count:" << count << endl;
return 0;
}
#include <iostream>
using namespace std;
int main(void){
string str;
cin >> str;
int len = str.size();
//abcdef
//fedcba
for(int i=0;i<len/2;i++){
str[i] = str[i] ^ str[len-i-1];
str[len-i-1] = str[i] ^ str[len-i-1];
str[i] = str[i] ^ str[len-i-1];
}
cout << str << endl;
return 0;
}