文章目录
C++基础知识(一)
1、前言2、编译器环境3、第一个C++程序4、数据类型5、存储类
1、前言
2、编译器环境1979年,C++初生萌芽。在1983年的时候,正式改名为C++,本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)所创。C++既可以进行C语言的面向过程化的程序设计,也可以像Java语言面向对象(封装、继承、多态)的程序设计。它是一种中级语言,介于高级语言(自然语言)与低级语言(机器语言)之间。
MinGW(Minimalist GNU for Windows),它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时库。MinGW虽然附带支持系统剪贴板的Vim,但是使用体验相对GNU/Linux差很多,所以以Dev-C++作为编辑器为宜。
Dev-C++是一个Windows环境下的一个适合于初学者使用的轻量级C/C++集成开发环境(IDE),它是一款自由软件,遵守GPL(GNU通用公共许可证)分发源代码。
Vim是从Vi(文本编辑器)发展过来的,具有编译及错误跳转等方面编程的功能。Vim和Emacs(集成开发环境和文本编辑器)为Unix类系统用户最喜欢的文本编辑器。
C运行时库(C run-time library)是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。将C语言中的最常用部分(最基本和最常用的函数)独立出来,形成头文件和对应的Library,就形成了C运行时库。C++是C的超集,VC针对C++加入的Standard C++ Library主要包括:LIBCP.LIB,LIBCPMT.LIB和MSVCPRT.LIB。
GNU是一个自由的 *** 作系统,其内容完全以GPL方式发布,GNU类似于Unix,但不包含具有著作权的Unix代码(Unix是不开源,封闭的)。GNU后期与Linux(内核)相结合产生了一个完整的自由软件 *** 作系统,称之为GNU/Linux,简称Linux。
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器,是一套由 GNU 开发的编程语言编译器。GCC原名为GNU C语言编译器(GNU C Compiler),GCC最初用来处理C语言,后期扩展,变得可以处理C++,Java等更多编程语言,所以改名GNU编译器套件。
3、第一个C++程序
C++ ⊇ C,C++是C的超集,即C++兼容C。
C++在C的基础下进行了升级,我们来见证第一个C++程序。C++代码如下:
#include//输入输出流头文件 using namespace std;//C++标准程序库中的所有标识符都被定义于一个名为std的命名空间 namespace 中 int main(){ //C++常用的输入输出函数 cout << "please input a string:" << endl; char string[100]; cin >> string; cout << string << endl; //C常用的输入输出函数 printf("please input a string:n"); scanf("%s",string); printf("%sn",string); //调用DOS系统的暂停命令 pause 来暂停程序执行,按任意一个键后将继续执行。 system("pause"); return 0; }
4、数据类型
C++的基本类型有bool,char,int,float,double,void(无类型),wchar_t(宽字符)等,一些基本类型可以使用一个或多个类型修饰符进行修饰,有signed,unsigned,short,long等修饰符。
枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
enum 枚举名(){ 标识符1(=整型常数), 标识符2(=整型常数), ... 标识符n(=整型常数) } 枚举变量;
第一个枚举成员的默认值为整型的0,后续枚举成员的值依次加1,而且可以将枚举量赋值给整型变量,但反过来就不行。C++代码如下:
int main(){ enum sex{boy,girl}; enum weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun}weekday1,weekday2; int a = boy;//将枚举变量赋值给整型变量。 int b = girl; weekday1 = Tue;//weekday1,weekday2为weekday类型。 weekday2 = weekday1; int i = weekday2; int j = Wed; cout << a << endl; cout << b << endl; cout << i << endl; cout << j << endl; system("pause"); return 0; }
运行结果:
0 1 1 2
实例:随机从一周中抽取两天休息时间,输出有多少个不同的组合。C++代码如下:
#include//输入输出流头文件 #include //输入输出流格式控制头文件,就像C里面的格式化输出一样 using namespace std;//C++标准程序库中的所有标识符都被定义于一个名为std的命名空间namespace中 int main(){ enum restday_set{Mon,Tue,Wed,Thu,Fri,Sat,Sun}; restday_set restday;//枚举类型变量 int count=0; for(int i=Mon;i<=Sun;i++){//Mon的值默认为0,Sun的值为6。 for(int j=i+1;j<=Sun;j++){ if(i!=j){ count++; cout << count; for(int c=1;c<=2;c++){ switch(c){ case 1:restday=(restday_set)i;break; case 2:restday=(restday_set)j;break; } switch(restday) { case 0: cout << setw(5) << "Mon"; break;//setw用来设置输出的域宽。 case 1: cout << setw(5) << "Tue"; break; case 2: cout << setw(5) << "Wed"; break; case 3: cout << setw(5) << "Thu"; break; case 4: cout << setw(5) << "Fri"; break; case 5: cout << setw(5) << "Sat"; break; case 6: cout << setw(5) << "Sun"; break; } } cout << endl; } } } cout << "There are " << count << " options for your rest days." << endl; system("pause"); return 0; }
运行结果:
1 Mon Tue 2 Mon Wed .... 20 Fri Sun 21 Sat Sun There are 21 options for your rest days.
5、存储类
存储类定义C++程序中变量/函数的范围(可见性)和生命周期。这些说明符放在它们所修饰的类型之前,存储类可分为auto(局部变量),register(局部变量),static(局部、全局皆可),extern(全局变量),mutable(仅用于类的对象),thread_local(C++ 11新定义,线程周期)等。
使用extern关键字来声明并引用全局变量,全局变量对所有的程序文件都是可见的,通常用于当有两个或多个文件共享相同的全局变量或函数的时候;使用static关键字修饰局部变量可以在函数调用之间保持局部变量的值,当修饰全局变量时,会使变量的作用域限制在声明它的文件内。helloworld.cpp代码如下:
#include//输入输出流头文件 #include "helloworld.h" using namespace std;//C++标准程序库中的所有标识符都被定义于一个名为std的命名空间namespace中 extern void func2(void); static int a = 6; int count; void func() { static int b = 9; b++; cout << "a=" << a <<" "<< "b=" << b < helloworld.h代码如下:
#includeusing namespace std; extern int count; void func2(void){ cout << "The number of runs is " << count << endl; } 运行结果:
a=5 b=10 a=4 b=11 a=3 b=12 a=2 b=13 a=1 b=14 a=0 b=15 The number of runs is 6mutable存储类只能用于类的数据成员,不能用于普通变量。具有mutable性质的类的数据成员打破了类对象的const限定,允许修改类中mutable关键字修饰的数据成员,即便类的其它成员仍然是const只读属性。C++代码如下:
#includeusing namespace std; class A { public: //mutable关键字修饰的变量,即使在const函数中也将永远处于可变的状态。 void test() const; mutable bool flag; int id;//id成员变量不能被修改 }; //const关键字修饰的函数是为了能够保护类中的成员变量。 void A::test() const{ flag = true; //定义id = 1;会报错In member function 'void A::test() const',成员变量不能被修改。 cout << flag << endl; cout << id << endl; } int main(){ A a; a.test(); system("pause"); return 0; } 运行结果:
1 0使用thread_local关键字声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。C++代码如下:
#include#include using namespace std; thread_local int n = 1; void func1(){ n++; cout << "thread number is " << this_thread::get_id() << " n=" << n << endl; //printf("thread number is %d, n=%dn",this_thread::get_id(),n); //cout如果存在输出格式问题,就用printf()验证。 } void func3(){ thread_local int m = 0; cout << "thread number is " << this_thread::get_id() << " m=" << m << endl; //printf("thread number is %d, m=%dn",this_thread::get_id(),m); m++; } void func2(){ func3(); func3(); } int main(){ n++; func1(); //主线程t,n=3 thread t2(func1);//子线程t2,n=2 thread t3(func1);//子线程t3,n=2 t2.join(); t3.join(); func2();//主线程t,n=0,n=1 thread t4(func2);//子线程t4,n=0,n=1 thread t5(func2);//子线程t5,n=0,n=1 t4.join(); t5.join(); //system("pause"); return 0; } 运行结果:
thread number is 140737348192064 n=3 [New Thread 0x7ffff7a53700 (LWP 2977)] thread number is 140737348187904 n=2 [New Thread 0x7ffff7252700 (LWP 2978)] [Thread 0x7ffff7a53700 (LWP 2977) exited] thread number is 140737339795200 n=2 thread number is 140737348192064 m=0 thread number is 140737348192064 m=1 [Thread 0x7ffff7252700 (LWP 2978) exited] [New Thread 0x7ffff7252700 (LWP 2979)] thread number is 140737339795200 m=0 thread number is 140737339795200 m=1 [New Thread 0x7ffff7a53700 (LWP 2980)] [Thread 0x7ffff7252700 (LWP 2979) exited] thread number is 140737348187904 m=0 thread number is 140737348187904 m=1 [Thread 0x7ffff7a53700 (LWP 2980) exited] [Inferior 1 (process 2976) exited normally]注:
从C++ 17开始,auto关键字不再是C++存储类说明符,且register关键字被弃用;如果运行报错error: 'a' was declared 'extern' and later 'static'表示静态全局变量不能用于在多文件中同一变量的传递,只能在声明它的文件中起作用,但是可以保证其他文件可以使用相同名称的变量;在C++中,mutable(可变的)也是为了突破const(不变的)的限制而设置的,被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
——>以上内容是关于C++的基础知识(一),希望对初学者或再次学习者有所帮助,基础打扎实,不怕风吹雨打! 如果以上内容有错误或者内容不全,望大家提出!我也会继续写好每一篇博文!
待续未完
——文优
欢迎观看和提问!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)