医学网站建设风格,许昌网站开发哪家好,网页版微信官方免费,wordpress 自动锚文本主要整理了N多年前#xff08;2010年#xff09;学习C的时候开始总结的知识点#xff0c;好长时间不写C代码了#xff0c;现在LLM量化和推理需要重新学习C编程#xff0c;看来出来混迟早要还的。
1.shared_ptr 解析#xff1a;shared_ptr是一种计数指针#xff0c;当引… 主要整理了N多年前2010年学习C的时候开始总结的知识点好长时间不写C代码了现在LLM量化和推理需要重新学习C编程看来出来混迟早要还的。
1.shared_ptr 解析shared_ptr是一种计数指针当引用计数变为0时shared_ptr所指向的对象将会被删除。如下所示
void test() {shared_ptr p1(new int); // 计数为1{shared_ptr p2(p1); // 计数为2{shared_ptr p2(p1); // 计数为3} // 计数为2} // 计数为1
} // 计数为0同时int对象被删除2.unique_ptr 解析unique_ptr是定义在中的智能指针(smart pointer)。它持有对对象的独有权即两个unique_ptr不能指向一个对象不能进行复制操作只能进行移动操作。
3.const类成员函数 解析const类成员函数不能修改任何成员变量但是mutable修饰的变量除外。 说明const int *p与int const *p没有区别const int *p; p可以修改但是p指向对象的内容不可修改int * const p; p不可修改但是p指向对象的内容可以修改。
4.拷贝构造函数 解析拷贝构造函数是一种特殊的构造函数函数的名称必须和类名称一致它必须的一个参数是本类型的一个引用变量。在C中三种对象需要调用拷贝构造函数的情况如下所示 1对象以值传递的方式传入函数参数。 2对象以值传递的方式从函数返回。 3对象需要通过另外一个对象进行初始化。 说明浅拷贝指的是在对象复制时只对对象中的数据成员进行简单的赋值默认拷贝构造函数执行的是浅拷贝。大多情况下“浅拷贝”都能很好地工作但是一旦对象存在了动态成员那么浅拷贝就会出现问题。
5.《C标准程序库》 解析 1第1章至第4章总体介绍了本书及C标准程序库 2第5章至第9章分别从各个方面描述STL 3第10章至第12章描述了一些“简单的”标准类别 4第13章至第14章的主题是I/O和国际化 5第15章描述C标准程序库中内存模型的概念。 6附录主要是参考资料。
6.模板类ostream_iterator 解析template class T, class charTchar, class traitschar_traitscharT class ostream_iterator;。举个例子如下所示
// ostream_iterator example
#include iostream // std::cout
#include iterator // std::ostream_iterator
#include vector // std::vector
#include algorithm // std::copyint main () {std::vectorint myvector;for (int i1; i10; i) myvector.push_back(i*10);std::ostream_iteratorint out_it (std::cout,, );std::copy ( myvector.begin(), myvector.end(), out_it );return 0;
}7.int* p和int *p区别 解析没有区别只不过int* p强调类型是int指针而int *p强调对象是int指针。
8.extern语法 解析 1extern修饰变量的声明 比如extern int i。 2extern修饰函数的声明 比如extern int fun(int i)。 3extern修饰C/C函数的调用规范 比如在C中调用C库函数需要在C中用extern C声明要引用的函数。
9.#pragma once 解析#pragma once是一个比较常用的C/C杂注只要在头文件的最开始加入这条杂注就能够保证头文件只被编译一次。需要注意的是这种方式是微软编译器独有的并且不支持跨平台。如果需要支持跨平台那么需要使用#ifndef/#define/#endif。
10.C中的Virtual关键字 解析 1virtual ReturnType Function_1(); //虚函数声明 2virtual ReturnType Function_2() 0; //纯虚函数声明 说明包含纯虚函数的类被称为抽象基类。
11.C关键字 解析
12.wchar_t宽字符类型双字节类型 解析wchar_t的本质是typedef unsigned short wchar_t;重点理解charwchar_tstringwstring类型之间的相互转换。 说明wstring是宽charUnicode编码一个字符占两个字节大小而string是窄charASCII编码一个字符占一个字节大小。 说明short int2个字节long int4个字节long double8个字节。要学会使用sizeof(wchar_t)查看数据类型的字节大小。
13.C中的左值和右值 解析 1左值lvalue指向内存位置的表达式被称为左值lvalue表达式。左值可以出现在赋值号的左边或右边。 2右值rvalue指的是存储在内存中某些地址的数值。右值可以出现在赋值号的右边但不能出现在赋值号的左边。
14.C全局变量初始值 解析 1int0 2char‘\0’ 3float0 4double0 5pointerNULL 说明当定义局部变量时系统不会对其进行初始化你必须自行对其进行初始化。
15.C内存区域划分 解析 1栈由编译器自动分配和释放通过存储的变量是局部变量、函数参数等。 2堆由new分配的内存块通常一个new对应一个delete。如果程序员没有释放掉那么在程序结束后操作系统会自动回收。 3自由存储区由malloc等分配的内存块用free释放掉内存块。 4全局/静态存储区全局变量和静态变量共同占用同一块内存区。 5常量存储区存储常量不能修改。
16.C类型限定符 解析 1constconst类型的对象在程序执行期间不能被修改改变。 2volatile修饰符volatile告诉编译器不对代码进行任何优化。 3restrictrestrict修饰的指针是能够访问所指区域的唯一入口。C99新增
17.C存储类 解析 1auto存储类所有局部变量默认的存储类。 2register存储类定义存储在寄存器中而不是RAM中的局部变量。 3static存储类局部变量全局变量类数据成员变量。 4extern存储类提供一个全局变量的引用全局变量对所有的程序文件都是可见的。 5mutable存储类如果类的成员函数不会改变对象的状态那么这个成员函数一般会声明成const的。如果需要在const的函数里面修改一些跟类状态无关的数据成员那么这个数据成员就应该被mutalbe来修饰。
18.C字符串 解析 1C风格字符串头文件#include 常用的函数包括strcpy(s1, s2)strcat(s1, s2)strlen(s1)strcmp(s1, s2)strchr(s1, ch)strstr(s1, s2)。 2C风格字符串头文件#include 。 说明C运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符。
19.C继承与权限 解析 1public public继承 public。 2public protected继承 protected。 3public private继承 private。 4protected public继承 protected。 5protected protected继承 protected。 6protected private继承 private。 7private public继承 子类无权访问。 8private protected继承 子类无权访问。 9private private继承 子类无权访问。 说明成员和类的默认访问修饰符是private。
20.友元函数和友元类 解析 1友元函数 类的友元函数可以访问类的所有私有private成员和保护protected成员但是友元函数并不是类的成员函数。比如 friend void printWidth( Box box ); 2友元类 友元类及其所有成员都是友元。比如friend class ClassTwo;
21.stringstream 解析标准头文件定义了一个叫做stringstream的类可以进行字符串与数值之间的相互转换。如下所示
string mystr (1204);
int myint;
stringstream(mystr) myint;说明命令执行完毕后变量myint存储的数值为1204。
22.字符串和其它数据类型的转换 解析函数库cstdlib提供了3个有用的函数。如下所示 1atoi: 将字符串string转换为整型int。 2atol: 将字符串string转换为长整型long。 3atof: 将字符串string转换为浮点型float。
23.ANSI-C中的动态内存管理 解析 1malloc函数void *malloc(unsigned int num_bytes)动态申请size个字节的内存空间。 2calloc函数void *calloc(unsigned n, unsigned size)用于向系统动态申请n个每个占size个字节的内存空间并把分配的内存全都初始化为零。 3realloc函数void *realloc(void *p, unsigned size)将指针p所指向的已分配内存区的大小改为size。 4free函数void free(void *p)释放指针p所指向的内存空间。
24.const char * what() const throw() 解析const throw()是异常规格说明它表示what()可以抛出异常的类型类型说明放到()里面比如throw(int)。如果里面没有类型那么表示这个函数不抛出任何异常。通常函数后面不写throw()表示该函数可以抛出任何类型的异常。
25.C多线程编程 解析 1Linux下常用#include pthread.h对应的Windows版本为POSIX Threads for Win32。 2C准标准库中的#include boost/thread.hpp。 3C11标准库中的#include 。 4Win32多线程中的#include windows.h和#include process.h。
26.函数模板 解析首先我们定义一个函数模板如下所示
// returns 0 if the values are equal, 1 if v1 is larger, -1 if v1 is smaller
template typename T
int compare(const T v1, const T v2) {if(v1 v2) return -1;if(v1 v2) return 1;return 0;
}1模板形参表 解析模板形参可以是表示类型的类型形参也可以是表示常量表达式的非类型形参。 2实例化模板函数 解析编译器能够确定用什么类型代替每个类型形参以及用什么值代替每个非类型形参。推导出实际模板实参后编译器使用实参代替相应的模板形参产生并编译该版本的函数。 3inline函数模板 template typename T inline T min(const T, const T) 解析需要说明的是inline放在模板形参后返回类型前。在类内定义的函数默认为inline成员函数而在类外定义的函数前面需加inline才是内联函数。
27.类模板 解析首先我们定义一个类模板如下所示
template class Type class Queue {
public:Queue(); // 默认构造函数Type front(); // 返回队头元素的引用const Type front() const;void push(const Type); // 在队尾增加一项void pop(); // 从队头删除一项bool empty() const; // 指出队列中是否有元素private:// ...
}当我们使用类模板时必须显示指定实参比如Queue vector qc; 那么Queue中Type的实际类型为vector。 说明像通常的函数或类一样我们可以仅对函数模板或类模板进行声明操作而不进行定义操作。
28.模板特殊化 解析模板特殊化定义template class class_name 。 1在类名称后面必须将使用的具体数据类型写在尖括号中比如template class pair {}。 2重新定义类的所有成员成员变量和成员函数的特殊化实现。
29.模板定义常用方式 解析 1template // 一个class参数 2template class T, class U // 两个class参数 3template class T, int N // 一个class和一个整数 4template // 有一个默认值 5template int Tfunc (int) // 参数为一个函数 说明一般情况C模板的声明和定义要放在同一个文件中。
30.指针函数与函数指针 解析 1指针函数本质是函数该函数返回某一类型指针。函数原型类型标识符* 函数名(参数表)。比如int *f(xy); 2函数指针本质是指针即指向函数的指针变量。函数原型类型标识符 (*函数名)(参数表)。比如int (*f)(int x);
31.volatile 解析volatile关键字确保本条指令不会因编译器的优化而省略且要求优化器在用到这个变量时必须每次都小心地重新读取这个变量的值而不是使用保存在寄存器里的备份。
32.条件编译 解析当满足某条件时对一组语句进行编译而当条件不满足时则编译另一组语句。常用的条件编译指令包括#if#ifdef#ifndef#else#elif#endif等。
33.int sprintf( char *buffer, const char *format [, argument] ... ); 解析sprintf打印到字符串中而printf打印到命令行中。比如sprintf(s, “%d”, 123); // 产生字符串123。sprintf_s()是sprintf()的安全版本通过指定缓冲区长度来避免sprintf()存在的溢出风险。
34.int fprintf( FILE *stream, const char *format, [ argument ]...) 解析fprintf位于头文件stdio.h中其作用是格式化输出到一个流/文件中函数原型为int fprintf( FILE *stream, const char *format, [ argument ]…)fprintf()函数根据指定的格式(format)向输出流(stream)写入数据(argument)。比如printf(stream, “%d\n”, i);
35.C中的RTTI机制 解析RTTIRuntime Type Information即运行时类型信息头文件是#include 。如下所示 1typeid(datatype)的返回值类型是type_info类。 2typeid(datatype).name()返回当前变量的数据类型一般数据类型结构体或类等。比如int s; typeid(s).name()。 3可以使用type_info类中重载的和!运算符比较两个对象的类型是否相等。比如typeid(*a) typeid(A)。
36.C标准库异常类 解析exception类定义在头文件#include 中它的两个主要派生类为logic_error和runtime_error这两个类定义在头文件#include 中这个头文件包含在#include 中。logic_error类用于描述程序中出现的逻辑错误比如传递无效参数等。runtime_error指那些无法预料的事件所造成的错误比如硬件故障或内存耗尽等。 1从logic_error派生的异常类
domain_error报告违反了前置条件。
invalid_argument表明抛出这个异常的函数接收到了一个无效的参数。
length_error表明程序试图产生一个长度大于等于npos的对象npos是环境尺寸大小的最大可能值通常为std::size_t。
out_of_range报告一个参数越界错误。
bad_cast抛出这个异常的原因是在运行时类型识别中发现程序执行了一个无效的动态类型转换dynamic_cast表达式。
bad_typeid当表达式typeid(*p)中的参数p是一个空指针时抛出这个异常。2从runtime_error派生的异常类
range_error报告违反了后置条件。
overflow_error报告了一个算术溢出错误。
bad_alloc报告一个失败的存储分配。说明size_t#include 是一个与机器相关的unsigned类型其大小足以保证存储内存中对象的大小。
37.auto_ptr 解析std::auto_ptr类定义在头文件#include 中用来实现动态分配对象以及当对象不再需要时自动执行清理。如下所示
#include iostream
#include memory
#include cstddef
using namespace std;class TraceHeap {int i; // private
public:static void* operator new (size_t siz){void* p ::operator new(siz);cout allocating traceheap object on the heap at address p endl;return p;}static void operator delete (void* p) {cout deleting traceheap object at address p endl;::operator delete(p);}TraceHeap(int i) : i(i) {}int getVal() const { return i; }
};int main() {auto_ptrTraceHeap pMyObject(new TraceHeap(5));cout pMyObject-getVal() endl;return 0;
} ///:~说明尽管程序没有显式删除原始指针但是在栈反解的时候pMyObject对象的析构函数会删除该原始指针。
38.static成员函数 解析 1static成员函数是类的组成部分而不是任何对象的组成部分。 2static成员函数没有this指针。 3static成员函数不能声明为const。 说明C没有原始基类的概念。
39.预定义的宏名称 解析 1LINE整数值表示当前正在编译的行在源文件中的行数。 2FILE字符串表示被编译的源文件的文件名。 3DATE一个格式为Mmm dd yyyy的字符串存储编译开始的日期。 4TIME一个格式为hh:mm:ss的字符串存储编译开始的时间。 5__cplusplus整数值所有C编译器都定义了这个常量为某个值。如果这个编译器是完全遵守C标准的它的值应该等于或大于199711L具体值取决于它遵守的是哪个版本的标准。 说明C中常用的预处理指令有#define#undef#ifdef#ifndef#if#endif#else#elif#line#error#include#pragma等。
40.高级类型转换 解析ANSI-C标准定义了4种类型转换操作符reinterpret_cast new_type (expression)dynamic_cast new_type (expression)static_cast new_type (expression)const_cast new_type (expression)。其中new_type是要转换成的目标类型expression是要被转换的内容。如下所示 1reinterpret_cast可以将一个指针转换为任意其它类型的指针。它也可以用来将一个指针转换为一个整型或反之亦然。 2static_cast执行所有能够隐含执行的类型转换以及它们的反向操作即使这种方向操作是不允许隐含执行的。 3dynamic_cast用来进行任何可以隐含进行的转换操作以及它们被用于多态类情况下的方向操作。 4const_cast这种类型转换对常量const进行设置或取消操作。
41.文件的输入输出 解析C中支持文件的输入输出类ofstream写操作输出的文件类继承ostream类ifstream读操作输入的文件类继承istream类fstream可同时读写操作的文件类继承iostream派。 1打开文件模式
ios::in为输入读而打开文件。
ios::out为输出写而打开文件。
ios::ate初始位置为文件尾。
ios::app所有输出附加在文件末尾。
ios::trunc如果文件已存在则先删除该文件。
ios::binary二进制方式。说明ofstreamifstream和fstream类的成员函数open包含默认打开文件的方式分别为ios::out | ios::truncios::inos::in | ios::out。 2eof和getline函数
eof是ifstream从类ios中继承过来的当到达文件末尾时返回true。
getline函数的作用是从输入流中读取一行字符语法istream getline (istream is, string str, char delim)。3状态标志符
bad()如果在读写过程中出错那么返回true。
fail()如果在读写过程中出错或格式错误那么返回true。
eof()如果读文件到达文件末尾那么返回true。
good()如果没有以上错误那么返回true。
clear()重置以上成员函数所检查的状态标志。4获得和设置流指针
ifstream有一个被称为get pointer的指针指向下一个将被读取的元素。
ofstream有一个被称为put pointer的指针指向写入下一个元素的位置。
fstream同时继承了get和put属性。说明ofstream类ifstream类和fstream类均在头文件#include 中。
42.struct与class 解析struct继承class是public继承而class继承struct是private继承。
43.SLAM 解析SLAMsimultaneous localization and mapping即时定位与地图构建。
44.动态绑定和静态绑定 解析 1对象的静态类型对象在声明时采用的类型是在编译期确定的。 2对象的动态类型目前所指对象的类型是在运行期决定的。 3静态绑定绑定的是对象的静态类型某特性比如函数依赖于对象的静态类型发生在编译期。 4动态绑定绑定的是对象的动态类型某特性比如函数依赖于对象的动态类型发生在运行期。 说明对象的动态类型可以改变但是静态类型不能改变。只有虚函数使用的是动态绑定其他的全部使用的是静态绑定包括缺省参数。
45.文件位置指针 解析istream提供了用于重新定位文件位置指针的成员函数seekgostream提供了用于重新定位文件位置指针的成员函数seekp。如下所示 1fileObject.seekg( n ); 2fileObject.seekg( n, ios::cur ); 3fileObject.seekg( n, ios::end ); 4fileObject.seekg( 0, ios::end ); 说明seekg和seekp的第一个参数通常是一个长整型第二个参数用于指定查找方向其中ios::beg表示从流的开头开始定位默认ios::cur表示从流的当前位置开始定位ios::end表示从流的末尾开始定位。
46.C标准异常 解析C标准异常定义在头文件#include 中如下所示 1std::exception该异常是所有标准C异常的父类。 2std::bad_alloc该异常可以通过new抛出。 3std::bad_cast该异常可以通过dynamic_cast抛出。 4std::bad_exception这在处理C程序中无法预期的异常时非常有用。 5std::bad_typeid该异常可以通过typeid抛出。 6std::logic_error理论上可以通过读取代码来检测到的异常。 7std::domain_error当使用了一个无效的数学域时会抛出该异常。 8std::invalid_argument当使用了无效的参数时会抛出该异常。 9std::length_error当创建了太长的std::string时会抛出该异常。 10std::out_of_range该异常可以通过方法抛出比如std::vector和std::bitset::operator。 11std::runtime_error理论上不可以通过读取代码来检测到的异常。 12std::overflow_error当发生数学上溢时会抛出该异常。 13std::range_error当尝试存储超出范围的值时会抛出该异常。 14std::underflow_error当发生数学下溢时会抛出该异常。
47.C标准库 解析 1标准函数库这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自C语言。
输入/输出 I/O
字符串和字符处理
数学
时间、日期和本地化
动态分配
宽字符函数
其它2面向对象类库这个库是类及其相关函数的集合。
标准的 C I/O 类
String 类
数值类
STL容器类
STL算法
STL函数对象
STL迭代器
STL分配器
本地化库
异常处理类
杂项支持库说明C标准库包含所有的C标准库为了支持类型安全做了一定的添加和修改。
48.C/C常用头文件 解析 1#include STL双端队列容器。 2#include 异常处理类。 3#include 文件输入/输出。 4#include STL定义运算函数代替运算符。 5#include 定义各种数据类型最值常量。 6#include STL线性列表容器。 7#include STL映射容器。 8#include 参数化输入/输出。 9#include 基本输入/输出支持。 10#include 基于字符串的流。 11#include STL堆栈容器。 12#include STL通用算法。 13#include STL位集容器。 14#include 字符处理。 15#include 标准异常类。 16#include 底层输入/输出支持。 17#include 字符串类。 18#include STL通用模板类。 19#include STL动态数组容器。 20#include 输入/输出系统使用的前置声明。 21#include 定义错误码。 22#include 定义本地化函数。 23#include 定义数学函数。 24#include 复数类。 25#include 定义输入/输出函数。 26#include 定义杂项函数及内存分配函数。 27#include 字符串处理。 28#include 定义关于时间的函数。 29#include 数据流输入/输出。 30#include 基本输入流。 31#include 基本输出流。 32#include STL队列容器。 33#include STL集合容器。 34#include 宽字符处理及输入/输出。 35#include 宽字符分类。 36#include complex.h复数处理。 37#include fenv.h浮点环境。 38#include inttypes.h整数格式转换。 39#include stdbool.h布尔环境。 40#include stdint.h整型环境。 41#include tgmath.h通用类型数学宏。
49.完全安装Boost 解析Boost库是为C语言标准库提供扩展的一些C程序库的总称。安装实现的功能Boost大致可分为20类 1字符串和文本处理。 2容器。 3迭代器。 4算法。 5函数对象和高阶编程。 6泛型编程。 7模板元编程。 8预处理元编程。 9并发编程。 10数学和数字。 11排错和测试。 12数据结构。 13图像处理。 14输入输出。 15跨语言混合编程。 16内存管理。 17解析。 18编程接口。 19杂项。 20编译器问题的变通方案。
参考文献 [1]cplusplushttp://www.cplusplus.com/ [2]C的const类成员函数http://blog.csdn.net/lihao21/article/details/8634876 [3]C拷贝构造函数详解http://blog.csdn.net/lwbeyond/article/details/6202256 [4]C Primer第4版 [5]volatilehttp://baike.baidu.com/link?urlVEBsQt5II-QxbLx-CrpazjHbyWt5tVMflp_EaCSK_n50c5KABprxEgfnq1mdn_Krjzeq_cpybReD4H2epmPDya [6]条件编译http://baike.baidu.com/link?urlx92_9-h5i4tA01RIUg-0aqO6M1n77uv2u7zpA1Mcp9TTVlTYMm6lQGq4EE3Mvyf25fapXG00KJQysT1mAADqxq [7]类型转换高级http://www.prglab.com/cms/pages/c-tutorial/advanced-concepts/class-type-casting.php [8]深入理解 C 的动态绑定和静态绑定http://blog.csdn.net/chgaowei/article/details/6427731 [9]C标准库http://www.runoob.com/cplusplus/cpp-standard-library.html [10] Boost C Librarieshttp://www.boost.org/