C++概述
C++ 是 C 的一个超集, C 属于C++,C++比C多类等概念 最开始就是C语言,写着写着就诞生了很多更方便的写法, 同时也融入一些看待世界的思想,比如一切事物皆对象, 收集,整体,封装,改进,优化...打造出来就叫C++了... 如果你会C,那么看C++的时候,就会自然产生下面的一些想法: 1. 这个在C中也有...但形式上有些不一样 2. 这个是对C中的**做了改进,嗯用起来方便多了... 3. 有些功能被禁用了... 2020发布C++20
代码示例
#include <iostream> //头文件 using namespace std; //std命名空间,加上命名空间就省去了 std.变量1 的std.,直接使用变量1就可以了 int main() { int a = 1; #if a==1 cout << "is 1\n" << endl; #else cout << "条件编译:int型变量在编辑时的默认初始化值为0 \n" << endl; #endif cout << "C++!\n" << endl; return 0; }
编译与执行
(base) xt@VM-8-13-ubuntu:/opt/tpf/cwks/C++$ g++ c01.cpp (base) xt@VM-8-13-ubuntu:/opt/tpf/cwks/C++$ ./a.out 条件编译:int型变量在编辑时的默认初始化值为0 C++!
整数,浮点,布尔,字符
C/C++ 通用6种类型:int,char,float,double,bool,void 类型修饰符有四个: 长短正负,long,short,unsigned,signed signed英/saɪnd/美/saɪnd/ adj.有符号的;已签字的;有正负之分的 C++比C多一个wchar_t,用于表示超过1个字节的字符 01就不说了,计算机底层是01,任一语言底层都是01组合, 就 数据类型来说,实际上只有两种,数字与字符 数字分了整数与浮点,字符组合出来字符串 再派生/衍生的话,就是指针,枚举,结构体等更复杂的类型了
整数类型
short 2字节 int 4字节 long 4字节 long long 8字节
#include <iostream> using namespace std; int main () { int a=1; short b1 =2; short int b2 =2; long c =3; long long d =4; cout << a << b1 << b2 << c <<d << endl; return 0; } $ g++ c02.cpp $ ./a.out 12234
浮点类型
float 4字节 double 8字节 long double 16字节
字符类型
字符,单个的符就是字符,一个英文字母,一个汉字,一个&,都是一个字符 char a ='A';
中文在操作系统中有乱码现象,所以操作中文时,要使用特定的编码 查看linux系统已有中文字符集 (base) [xt@ai1 web73]$ locale -a|grep zh_CN zh_CN zh_CN.gb18030 zh_CN.gb2312 zh_CN.gbk zh_CN.utf8 utf8用三个字节表示一个汉字
#include <iostream> using namespace std; int main () { char a ='A'; char b[4] = "我"; // 3+\0 std::locale::global(std::locale("zh_CN.utf8"));//要选系统上有的中文字符集 wchar_t c=L'我'; // 用4字节存一个3字节的汉字 // cout<<"size:"<<sizeof(c)<<endl; //size:4 wchar_t d[3]=L"我们"; //2+\0 wcout<<"c="<<c<<",d="<<d<<endl; return 0; } $ g++ c02.cpp $ ./a.out c=我,d=我们 注意: 使用wcout输出时,不要使用cout,二者不要同时使用 L是与wchar_t配合使用的
C++数组
#include <iostream> using namespace std; int main () { int a[]={1}; char b[3] ="ab"; cout << a[0] << b[1] << endl; return 0; } $ g++ c02.cpp $ ./a.out 1b 字符串默认最后一个字符是\0
bool 布尔,true为1,false为0
#include <iostream> using namespace std; int main () { bool a= true; bool b =false; cout << a << b << endl; return 0; } $ g++ c02.cpp $ ./a.out 10
指针类型 type*
#include <iostream> using namespace std; int main () { bool a= true; bool* b = &a; cout << a << *b << endl; return 0; } $ g++ c02.cpp $ ./a.out 11
复合类型
枚举, 结构体, 共用体, 类
变量作用范围:局部变量与全局变量
位于{}内的,比如方法/类的{},作用范围被限定于该{},就是局部变量 {}外的就是全局变量,作用于整个文件 当二者重名时,{}内的覆盖{}外的
方法中的静态变量:方法调用结束,静态变量值不消失
#include <cstdio> #include <iostream> using namespace std; void bb(int& b){ static int count = 1; count = count + b; printf("count =%d\n",count); } int main(){ int b=2; bb(b); //count =3 bb(b); //count =5 return 0; }
结构体中的静态变量:所有实例共享静态变量
#include <cstdio> #include <iostream> using namespace std; //声明 struct Students { static int sid; float score; }; //定义 int Students::sid = 2; int main(){ //使用 Students::sid = 3; printf("sid=%d\n",Students::sid); //sid=3 Students st1; printf("st1.sid=%d\n",st1.sid); //st1.sid=3 st1.sid = 4; Students st2; printf("st2.sid=%d\n",st2.sid);//st2.sid=4 return 0; }
#include <cstdio> #include <iostream> using namespace std; namespace aa{ //声明 struct Students { static int sid; float score; }; } //定义 int aa::Students::sid = 2; int main(){ //使用 aa::Students::sid = 3; printf("sid=%d\n",aa::Students::sid); //sid=3 return 0; }
cstdio:使用C的printf
#include <cstdio> #include <iostream> using namespace std; int main(){ printf("%d:%s\n",1,"abc"); return 0; } [root@kl C++]# g++ g.cpp [root@kl C++]# ./a.out 1:abc
C++引用 &: 原变量所指内容的一个别名
& 在C++中表示引用, int a =1; 会在编辑时为a在栈中分配一个4字节的内存空间p1; 字符a是一个变量,它的值是内存地址p1指向的4字节空间中01组合出来的一个数; int& b =a; b引用a,并不会为b分配内存空间, 字符b也是一个变量,它直接指向变量a值的地址p1 也就是说,一个地址对应了多个变量符号 "引用"这个词也形象,是说b本身没啥内容,它只是a的一个引用罢了 也可以说b是a的别名,就像古人有两个名字一样, 诸葛亮,字孔明,号卧龙,不管你说孔明,还是说卧龙,大家都知道你说的是诸葛亮
引用的本质是传址,但在形式上做了简化
#include <cstdio> #include <iostream> using namespace std; void aa(int* a){ *a =1; } void bb(int& b){ b =1; } int main(){ int a =11,b=22; aa(&a); bb(b); printf("a=%d,b=%d\n",a,b); return 0; } (base) [xt@kl C++]$ g++ g.cpp (base) [xt@kl C++]$ ./a.out a=1,b=1
C++引用代码示例
#include <iostream> using namespace std; void swap(int& a, int& b) { int tmp; tmp = a; a = b; b = tmp; return; } int main () { int a = 1, b = 2; swap(a, b); cout <<"a="<< a <<",b="<< b << endl; return 0; } (base) [xt@ai1 C++]$ g++ c02.cpp (base) [xt@ai1 C++]$ ./a.out a=2,b=1
#include <iostream> using namespace std; void print(int i) { cout << i << endl; } void print(double f) { cout << f << endl; } void print(char c[]) { cout << c << endl; } int main (int argc, char** argv) { int a=1; double b = 2.1; char ss[] = "wa ka ka"; print(a); print(b); print(ss); return 0; }
#include <iostream> template <typename T> void swap(T &a, T &b) { T tmp{a}; a = b; b = tmp; } template<typename T, typename L> void print(T &a, L &l) { std::cout << a << "," << l << std::endl; } template<typename T> inline T & get(T &a) { return a; } template<typename T> inline T const& put(T const& a) { return a; } int main(int argc, char* argv[]) { int a = 1; int b = 2; swap(a, b); // 使用函数模板 std::cout << "a=" << a << ", b=" << b << std::endl; double c = 2.1; print(a,c); double d = get(c); std::cout << d << std::endl; float f = 3.1; float f2 = put(f); std::cout << f2 << std::endl; return 0; }
$ g++ d.cpp -std=c++11 $ ./a.out a=2, b=1 2,2.1 2.1 3.1