C++基础

c++IDE工具——CodeBlocks:
Download binary  http://www.codeblocks.org/downloads/binaries
NOTE: The codeblocks-17.12mingw-setup.exe(官网下载页的注释:这个版本带编译器) file includes additionally the GCC/G++ compiler and GDB debugger from TDM-GCC (version 5.1.0, 32 bit, SJLJ). The codeblocks-17.12mingw_fortran-setup.exe file includes additionally to that the GFortran compiler (TDM-GCC).

Makefile简易教程(不错)http://www.cnblogs.com/owlman/p/5514724.html
本文部分内容引用:
中文维基百科。
一个简单的Makefile教程。
Makefile简介
在软件开发中,make通常被视为一种软件构建工具。该工具主要经由读取一种名为“makefile”或“Makefile”的文件来实现软件的自动化建构。它会通过一种被称之为“target”概念来检查相关文件之间的依赖关系,这种依赖关系的检查系统非常简单,主要通过对比文件的修改时间来实现。在大多数情况下,我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。


C++中源文件与头文件的不同点与联系
理解C++中的头文件和源文件的作用 - CSDN博客  http://blog.csdn.net/yue34257667/article/details/45500811(清晰)

从技术层面上来说,*.h文件 *.c文件 *.cpp文件没什么区别,我可以定义*.a,*.b,*.s都可以
但从开发习惯来说,大家都遵循一个标准,那就是.h文件放声明,.cpp文件放定义(实现)。
1.cpp文件和.h文件有各自的分工,一般来说,h文件中是类的定义和类成员函数的声明,以及全局变量定义等;cpp文件是对应h文件中成员函数的代码实现。一般cpp文件代码较多。
这样做的好处:h文件只声明类成员函数,简单易懂,当其他文件要调用该类的接口时,只需包含该h文件,并在编译时将该h文件和同名cpp文件编译出的库文件一起连接即可。(如在lz写的main文件中只需#include"Alarm.h")
2.一般我们在编译的时候只编译cpp文件,将该cpp包含的h文件设为依赖。从而将这些cpp文件和h文件联系起来

一般来说,头文件提供接口,源文件提供实现。但是有些实现比较简单的,也可以直接写在头文件里,这样头文件接口实现一起提供。
在编译时,源文件里的实现会被编译成临时文件,运行时刻程序找到头文件里的接口,根据接口找到这些临时文件,来调用它们这些实现。

C/C++中extern关键字详解 - chao_yu - 博客园  http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

stdio:stdio 就是指 “standard input & output"(标准输入输出)

所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!

例如c语言中的 printf("%d",i); scanf("%d",&i);等函数。

cout/cin/cerr/...:本质还是函数调用,不过这函数有些特殊,用的是运算符重载,确切地说(以下还是以cout为例)是重载了"<<"运算符。

如,cout:C++ Standard Output Stream,C++标准输出流。本质:std::cout.operator<<()函数,类型:std::ostream

自理解:有C的printf()类似输出功能。

cout是一个ostream类的对象,它有一个成员运算符函数operator<<,每次调用的时候就会向输出设备(一般就是屏幕啦)输出。用运算符重载,函数operator<<能够接受不同类型的数据,如整型、浮点型、字符串甚至指针,等等。

运算符函数与一般函数基本无异,可以任意重载。标准库定制了iostream::operator<<对于各种C++基本数据类型的重载版本,这才使得我们这些初学者们一上来就享受到

cout<<"Hello,World!"<<endl;
cout.operator<<("Hello,World!").operator<<(endl);

才算"强等效"。还有为什么可以连续写多个呢?请见如下的定义:
ostream& std::cout.operator<<();
注意前面的ostream&表示返回对象的引用,也就是可以继续cout了
对于cin,则是istream流类的对象,其重载了>>运算符,用法与cout大致相同

#include:的两种不同写法,#include<***.h>和#include"***.h"
采用"< >"方式进行包含的头文件表示让编译器在编译器的预设标准路径下去搜索相应的头文件,如果找不到则报错。
例如:VS2008的安装目录\Microsoft Visual Studio 9.0\VC\include下面就包含了标准库的头文件。
第二种方式:#include “aaa.h”表示先在工程所在路径下搜索,如果失败,再到系统标准路径下搜索。如果没有给出路径名,编译器将到当前子目录以及当前开发环境中的其它逻辑子目录里去寻找头文件。为了消除这种猜测,在导入自己的头文件时可以使用相对路径。如果头文件与主程序文件在同一个子目录里,则可以这么写:-# "./aaaa.h"。

Windwos通常使用反斜杠叙作为路径名的分隔符。./表示当前目录,../表示父目录,../dada/aaa.h表示平行目录。
所以,特别要注意的是,如果是标准库头文件,那么既可以采用<>的方式,又可以采用" "的方式,而用户自定义的头文件只能采用" "的方式。

Windows反斜杠\作用:
反斜杠\作为目录分隔符:D:\360Downloads
反斜杠\ 是转意。eg. \n 是换行
但是,因为web最开始在Unix上跑,所以URL也用 / 做目录分割符。https://www.zhihu.com/question/20254855
Unix只能用 /
Windows中斜杠/用法:做运算符斜杠/ 是除法。

记忆:反斜杠\,老师判题,做反了(错的),使用的符号。

接口(函数的原型)和实现(函数体的定义)分开是对代码进行模块化的基本原则之一。

利用C++预处理器,我们可以让头文件只在这个类没有被声明的情况下才声明它。

预处理器的条件指令:#为预处理标志
指令
#if:如果表达式为真,执行代码
#else:如果前面的#if表达式为假,执行代码
#elif:相当于elseif
#endif:用业标志一个条件指令的结束
#ifdef:如果本指令所引用的定义已经存在,执行代码
#ifndef:如果本指令所引用的定义不存在,执行代码

,预算编译器:
命名空间:
namespace:命名空间其实就是由用户定义的范围,同一个命名空间里的东西只要在这个命名空间独一无二就行了。
声明:namespace aaa{  }
打开:
命名空间意义:把东西放在它们自己的小盒子里,不让它们与可能有着相同名子的其它东西发生冲突。——这个特性也即决定了程序不能立刻使用命名空间里的内容。
打开方法一:std::out<<"i love you \n";
::这个符号是作用域,属于std这个作用域里的cout
打开方法二:使用using指令
using namespace std;
执行语句后,在std命名空间里的定义的东西可以直接使用:
cout<<"i love you"
不建议在文件开关用using namespace xx这种设计风格,否则把命名空间里的东西带到全局作用域里,跟我们使用命名空间的本意相违背。
打开方法三:using指令只将需要的特定命名从命名空间提取到全局作用域:
using std::cout;
cout<<"i love you \n"
特别注意:using指令出现位置决定着从命名空间里提取出来的东西能在哪个作用域使用。它放在所有函数声明的前面,具有全局性,放在某个函数里,它只在这个函数里可以使用。
链接和作用域:
lunix中例如:g++ -o test main.cpp rational.cpp
每一个源文件都被称为一个翻译单元(translation unit)。在一个翻译单元里定义的东西在另一个翻译单元里使用正是链接发挥作用的地方。
作用域、链接、存储类是相互关联的概念,只是观察和描述问题的角度不同罢了。

gcc g++支持C++11 标准编译及其区别  https://www.cnblogs.com/kex1n/p/7072092.html

存储类(storage class)
每个变量都有一个存储类,它决定着程序将变量的值存储在计算机上的某个地方、如何存储以及变量应该有着怎样的作用域。
第一种存储类:黙认的存储类是auto(自动),但你不会经常看到这个关键字。
自动变量存储在称为栈(stack)的临时内存里并有着最小的作用域,当程序执行到语句块或函数末尾的右花括号时,它们将被回收(栈回收),不复存在。
第二种存储类:与auuto不同的是static,static变量在程序生命期内将一直保有它的值而不会消亡,因为它们存储在静态存储区,生命周期为从申请到程序退出(和全局变量一样)。
一个static变量可以有external或internal链接。
第三种存储类是extern,它在有多个翻译单元时非常重要。这个关键字用来把另一个翻译单元里的某个变量声明为本翻译单元的一个同名全局变量。
编译器不会为extern变量分配内存,因为extern这个关键字告诉编译器:这个变量在其它翻译单元肯定存在,在其它地方已经为它分配过内存。
第四类:register,它要求编译器把一个变量存储在CPU的寄存器里,但有着与自动变量相同的作用域。它存储速度最快,但有些编译器可能不允许使用这类变量。
变量的链接和作用域
编译器编译程序时,它同3个步骤构成:
1、执行预处理器指令;
2、把.cpp文件编译成.o文件;
3、把.o文件链接成一个可执行文件。

如今的编译器都是一次完成所有的处理。


C语言中,signed long类型的与unsigned long类型的有什么区别?signed long能表示[-2^31, 2^31-1]之间的整数

unsigned long能表示[0, 2^32-1]之间的整数


C++标准程序库:C++Standard Library,子库:标准模板程序库

C++标准程序库_百度百科  https://baike.baidu.com/item/C++标准程序

C++中的标准程序库是类库和函数的集合,其使用核心语言写成。标准程序库提供若干泛型容器、函数对象、泛型字符串和流(包含交互和文件I/O),支持部分语言特性和常用的函数,如开平方根。C++标准程序库也吸收了ISO C90 C标准程序库。标准程序库的特性声明于std命名空间之中。
标准模板程序库是C++标准程序库的子集,包含容器、算法、迭代器、函数对象等。也有些人使用术语STL代表C++标准程序库。

c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。使用C++标准程序库时,标准头文件无“.h”。

标准头文件:iostream、vector等等,写成#include <iostream>

using namespace std详解
一 :
<iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。
后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。

因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。

二:
所谓namespace,是指标识符的各种可见范围。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。
using std::cout;
using std::endl;
以上程序可以写成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std;
例如:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
cout << hex << 3.4 << endl;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
codeblocks-17.12mingw-nosetup 免安装版 下载解压之后就可以直接使用无需安装 文件列表: Addr2LineUI.exe CbLauncher.exe cbp2make.exe cb_console_runner.exe cb_share_config.exe codeblocks.dll codeblocks.exe dbghelp.dll exchndl.dll mgwhelp.dll MinGW MinGW\bin MinGW\bin\addr2line.exe MinGW\bin\ar.exe MinGW\bin\as.exe MinGW\bin\c++.exe MinGW\bin\c++filt.exe MinGW\bin\cpp.exe MinGW\bin\dlltool.exe MinGW\bin\dllwrap.exe MinGW\bin\elfedit.exe MinGW\bin\g++.exe MinGW\bin\gcc-ar.exe MinGW\bin\gcc-nm.exe MinGW\bin\gcc-ranlib.exe MinGW\bin\gcc.exe MinGW\bin\gcov.exe MinGW\bin\gdb.exe MinGW\bin\gdbserver.exe MinGW\bin\gprof.exe MinGW\bin\ld.bfd.exe MinGW\bin\ld.exe MinGW\bin\libatomic-1.dll MinGW\bin\libcharset-1.dll MinGW\bin\libgcc_s_dw2-1.dll MinGW\bin\libgcc_s_sjlj-1.dll MinGW\bin\libiconv-2.dll MinGW\bin\libintl-8.dll MinGW\bin\libquadmath-0.dll MinGW\bin\libssp-0.dll MinGW\bin\libstdc++-6.dll MinGW\bin\libwinpthread-1.dll MinGW\bin\mingw32-c++.exe MinGW\bin\mingw32-g++.exe MinGW\bin\mingw32-gcc-4.9.2.exe MinGW\bin\mingw32-gcc-ar.exe MinGW\bin\mingw32-gcc-nm.exe MinGW\bin\mingw32-gcc-ranlib.exe MinGW\bin\mingw32-gcc.exe MinGW\bin\mingw32-make.exe MinGW\bin\mingwm10.dll MinGW\bin\nm.exe MinGW\bin\objcopy.exe MinGW\bin\objdump.exe MinGW\bin\ranlib.exe MinGW\bin\readelf.exe MinGW\bin\size.exe MinGW\bin\strings.exe MinGW\bin\strip.exe MinGW\bin\windmc.exe MinGW\bin\windres.exe MinGW\bin\zip.exe MinGW\bin\zlib1.dll MinGW\COPYING.ISL.txt MinGW\COPYING.MinGW.txt MinGW\COPYING.RUNTIME-gcc-tdm.txt MinGW\COPYING.winpthreads.txt MinGW\COPYING3-gcc-tdm.txt MinGW\COPYING3.LIB-gcc-tdm.txt MinGW\doc MinGW\doc\runtime MinGW\doc\runtime\CONTRIBUTORS MinGW\doc\runtime\DISCLAIMER MinGW\doc\runtime\README MinGW\include MinGW\include\accctrl.h MinGW\include\aclapi.h MinGW\include\aclui.h MinGW\include\adsprop.h MinGW\include\afxres.h MinGW\include\amaudio.h MinGW\include\amvideo.h MinGW\include\assert.h MinGW\include\audevcod.h MinGW\includ

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值