C++“关于”系列——迷雾击破整理
文章平均质量分 73
《C++ Primer Plus(6th》书中出现的常见可能引发思考的问题,剖析解析之~
itzyjr
Stay hungry,Stay foolish!
展开
-
❥关于C++之const重载与调用
#include <iostream>using namespace std;struct A { int count() { cout << "non const" << endl; return 1; } int count() const {// 调用对象不能被修改 cout << "const" << endl; return 1; } int count(int& s) { cout <.原创 2022-03-23 18:02:10 · 1046 阅读 · 0 评论 -
❥关于C++之用cout进行格式化
#include <iostream>using namespace std;int main() { int i = 273; cout << i << endl; cout << -i << endl; cout << "————————————" << endl; double d1 = 1.200; cout << d1 << endl; cout << (d1.原创 2022-03-21 21:08:03 · 1805 阅读 · 0 评论 -
❥关于C++之streambuf
typedef basic_streambuf<char> streambuf;typedef basic_streambuf<wchar_t> wstreambuf;<streambuf>提供streambuf缓冲区类,与输入/输出流结合使用。关于streambuf的资料并不多,IO Streams作者Jerry Schwarz这样说道:我最初设计的一个主要目标是以有趣的方式扩展它。特别是在流库中,streambuf类是一个实现细节,但在iostr...原创 2022-03-21 19:34:14 · 1271 阅读 · 0 评论 -
❥关于C++之stringstream典型用法
typedef basic_stringstream<char> stringstream类描述:流类对字符串进行操作。此类的对象使用包含字符序列的字符串缓冲区。可以使用成员str作为string对象直接访问此字符序列。可以使用输入和输出流上允许的任何操作来插入和/或从流中提取字符。一个典型使用示例:下面图片展示的是一个3D模型的OBJ格式的文件内容:蓝色v开头的是三角形顶点坐标(x, y, z);红色vt开头的是所有顶点的纹理坐标(纹理坐标列表比顶点列表长的原...原创 2022-03-21 18:08:27 · 1620 阅读 · 0 评论 -
❥关于C++之函数指针&函数对象
函数指针以下是<cstdlib>库中的一个排序数组的方法qsort()的函数原型。void qsort (void* base, size_t num, size_t size,int (*compar)(const void*, const void*));base-- 指向要排序的数组的第一个元素的指针。 num -- 由 base 指向的数组中元素的个数。 size-- 数组中每个元素的大小,以字节为单位。 compar-- 用来比较两个...原创 2022-03-20 21:09:39 · 795 阅读 · 0 评论 -
❥关于C++之多线程┆<thread>join()、detach()
std::thread (C++11)class thread;描述:thread类来表示执行的各个线程。执行线程是一个指令序列,可以在多线程环境中与其他此类序列并行执行,同时共享相同的地址空间。➊初始化的thread对象表示活动的执行线程;这样的线程对象是可接合的,并且具有唯一的thread id。➋默认构造(未初始化)的thread对象是不可接合的,其thread id对于所有不可接合的线程都是公共通用的。➌如果从中移动,或者调用了接合(join)或分离(detach),则可接合线程将原创 2022-03-20 18:20:24 · 1803 阅读 · 1 评论 -
❥关于C++之右值引用&移动语义┇移动构造&移动复制
右值引用(C++11)传统的左值是一个表示数据的表达式(如变量名或解除引用的指针),程序可获取其地址。左值引用使得标识符关联到左值。右值引用,这是使用&&表示的。右值引用只能关联右值,即可出现在赋值表达式右边。右值包括字面常量(C-风格字符串除外,它表示地址)、诸如x+y等表达式及返回值的函数(条件是该函数返回的不是引用):int x = 10;int y = 23;int z = 45;int&& r = z;// Error:Rvalue refe原创 2022-03-18 16:31:08 · 658 阅读 · 0 评论 -
❥关于C++之流状态(stream state)
cin或cout对象包含一个描述流状态(stream state)的数据成员(从ios_base类那里继承的)。流状态(被定义为iostate类型,而iostate是一种bitmask类型)由3个ios_base元素组成:eofbit、badbit或failbit,其中每个元素都是一位,可以是1(设置)或0(清除)。当cin操作到达文件末尾时,它将设置eofbit;当cin操作未能读取到预期的字符时,它将设置failbit。I/O失败(如试图读取不可访问的文件或试图写入写保护的磁盘),也可能将failbit原创 2022-03-18 00:08:41 · 4329 阅读 · 1 评论 -
❥关于C++之异常
首先阅读:有关异常和错误处理的新式 C++ 最佳做法https://docs.microsoft.com/zh-cn/cpp/cpp/errors-and-exception-handling-modern-cppthrow异常try-catch捕获:// error3.cpp -- using an exception#include <iostream>double hmean(double a, double b);int main() { double x, y.原创 2022-03-17 17:18:03 · 868 阅读 · 0 评论 -
❥关于C++之嵌套类
可以在一个类的范围内声明另一个类。 这样的类称为 "嵌套类"。嵌套类被视为在封闭类的范围内,并且可在该范围内使用。 若要从嵌套类的即时封闭范围之外的某个范围引用该类,则必须使用完全限定名。class BufferedIO {public: enum IOError { None, Access, General }; class BufferedInput {// Declare nested class BufferedInput. private: IOE原创 2022-03-17 15:30:47 · 1106 阅读 · 0 评论 -
❥关于C++之友元类
友元类的所有方法都可以访问原始类的私有成员和保护成员。看一个电视与遥控器的示例。遥控器可以改变电视机的状态,这表明应将Romote类作为Tv类的一个友元。// tv.h -- Tv and Remote classes#ifndef TV_H_#define TV_H_class Tv {private: int state; // on or off int volume; // assumed to be digitized原创 2022-03-17 14:47:09 · 227 阅读 · 0 评论 -
❥关于C++之私有继承
私有继承是C++另一种实现has-a(包含)关系的途径。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不会成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。下面,我们用Student类私有继承标准库中的std::string类:// studenti.h -- defining a Student class using private inheritance#include <iostream>#include <stri原创 2022-03-17 13:48:45 · 2857 阅读 · 0 评论 -
❥关于C++之详解类有DMA[必须]定义析构、复制构造和赋值&深度拷贝
如题,为什么派生类用到的动态内存分配(DMA),其就必须定义显式析构函数、复制构造函数和赋值运算符呢?一、派生类无DMA的情况(基类有DMA)// lacks.hclass BaseDMA {// Base Class Using DMAprivate: char* label; int rating;public: BaseDMA(const char* l = "null", int r = 0); void showB() const; virtual ~Bas原创 2022-03-16 02:34:14 · 1044 阅读 · 0 评论 -
❥关于C++之智能指针
首先,智能指针是模板类。智能指针是行为类似于指针的类对象,但这种对象还有其他功能。void remodel(std::string& str) { std::string* ps = new std::string(str); ... if (weird_thing) throw exception(); str = *ps; delete ps;}当remodel()这样的函数终止(不管是正常终止,还是由于出现了异常而终止),本地原创 2022-03-15 18:50:08 · 955 阅读 · 0 评论 -
❥关于C++之定位new运算符•显示调用析构函数
程序员必须负责管用定位new运算符用从中使用的缓冲区内存单元。要使用不同的内存单元,程序员需要提供两个位于缓冲区的不同地址,并确保这两个内存单元不重叠。例如,可以这样做:char* buffer = new char[512];JustTesting* pc1 = new (buffer) JustTesting;// place object in bufferJustTesting* pc2 = new (buffer + sizeof (JustTesting)) JustTesting("原创 2022-03-13 19:34:17 · 1043 阅读 · 0 评论 -
❥关于C++之类的复制构造函数&赋值运算符
一、复制构造函数复制构造函数用于将一个对象复制到新创建的对象中。类的复制构造函数原型:_Class(const_Class&);它接受一个指向类对象的常量引用作为参数。例如,StringBad类的复制构造函数的原型如下:StringBad(const StringBad &);何时调用复制构造函数?StringBad ditto(motto); // 调用StringBad(const StringBad &)StringBad metoo = mo..原创 2022-03-13 18:55:03 · 574 阅读 · 0 评论 -
❥关于C++之类的静态成员变量&静态成员函数
// strngbad.h#include <iostream>#ifndef STRNGBAD_H_#define STRNGBAD_H_class StringBad {private: char* str; int len; static int num_strings;public: StringBad(const char* s); StringBad();// default constructor ~StringBad(); friend std::os.原创 2022-03-13 17:53:17 · 355 阅读 · 0 评论 -
❥关于C++之类的析构函数
// stock.h#ifndef STOCK_H_#define STOCK_H_#include <string> class Stock { private: std::string company; long shares; double share_val; double total_val; void set_tot() {// implemented -> default 【inline】 total_val = shares * sh.原创 2022-03-13 16:51:14 · 572 阅读 · 0 评论 -
❥关于C++之类的转换函数
只有接受一个参数(其他参数有默认值的也算)的构造函数自动成为隐式转换函数。在C++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。因此,下面的构造函数用于将double类型的值转换为Stonewt类型:Stonewt(double lbs) // double转Stonewt的模板也就是说,可以编写这样的代码:Stonewt myCat; // 创建一个Stonewt对象myCat = 19.6;原创 2022-03-12 18:55:49 · 290 阅读 · 0 评论 -
❥关于C++之成员与友元函数重载运算符
类的友元函数,能够直接访问类的私有成员。但它的作用域不是类。// mytime.h#ifndef MYTIME3_H_#define MYTIME3_H_#include <iostream>class Time {private: int hours; int minutes;public: Time(); Time(int h, int m = 0); void AddMin(int m); void AddHr(int h); void Reset(int原创 2022-03-12 18:01:14 · 1206 阅读 · 0 评论 -
❥关于C++之类All
<!-- stock.h -->#ifndef STOCK1_H_#define STOCK1_H_#include <string>class Stock {private: std::string company; long shares; double share_val; double total_val; void set_tot() { total_val = shares * share_val; }public: Stock();// .原创 2022-03-07 21:41:18 · 729 阅读 · 0 评论 -
❥关于C++之命名空间示例
示例一:#include <iostream>#include <string>namespace nspA { struct stA { std::string name; int age; };};namespace nspB { struct stB { nspA::stA sta; float weight; };};int main() { using nspB::stB; stB stb; stb.sta = { "aku.原创 2022-03-07 19:14:11 · 130 阅读 · 0 评论 -
❥关于C++之泛型(模板函数&模板类)
template <typename AnyType>void Swap(AnyType &a, AnyType &b) { AnyType temp; temp = a; a = b; b = temp;}template<class T1, class T2>void ft(T1 x, T2 y) { ... ?type? xpy = x + y; ...}xpy的类型是什么?如果是int.原创 2022-03-07 18:32:01 · 357 阅读 · 0 评论 -
❥关于C++之std::ios_base::fmtflags/setf
public member typestd::ios_base::fmtflags输入流格式标志流格式标志的类型表示流格式标志的位掩码类型。此类型由成员函数flags、setf和unset用作其参数和/或返回值。这些函数传递和检索的值可以是以下成员常量的任何有效组合:// using ios_base::fmtflags#include <iostream>// std::cout, std::ios_base, std::ios, std::hex, std::showbase原创 2022-03-07 17:35:32 · 5818 阅读 · 0 评论 -
❥关于C++之引用
引用的本质是指针int rats = 101;int& alias = rats;int* prats = &rats;——————————————————————————alias <=> *prats <=> rats&alias <=> prats <=> &ratsalias和*prats都可以同rats互换,&alias和prats都可以同&rats互换。从这一点来说,引用看上去很像伪装原创 2022-03-03 17:18:27 · 591 阅读 · 0 评论 -
❥关于C++之函数与指针
与数据项相似,函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。double pam(int); // 函数原型double (*pf)(int); // 声明函数指针(参数为int型,返回值为double型)pf = pam; // 函数名就是函数的地址,这时pf就是指向函数pam()的指针(参数、返回值类型都匹配)double x = pam(4); // 用函数名调用double x = (*pf)(5); // 使用函数指针调用为何pam和(*pf)等价呢?由于pf是函数指原创 2022-03-03 15:50:13 · 228 阅读 · 0 评论 -
❥关于C++之各种杂货
C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型——整数、浮点数、指针,甚至可以是结构和对象!(有趣的是,虽然C++函数不能直接返回数组,但可以将数组作为结构或对象组成部分来返回。)...原创 2022-03-03 12:13:47 · 183 阅读 · 0 评论 -
❥关于C++之写入/读取文本文件
写入到文本文件使用文件输出的主要步骤如下:1.必须包含头文件<fstream>。2.头文件<fstream>定义了一个用于处理输出的ofstream类。3.需要声明一个或多个ofstream变量(对象),将ofstream对象与文件关联起来。方法之一是使用open()方法。4.使用完文件后,应使用方法close()将其关闭。5.可结合使用ofstream对象和运算符<<来输出各种类型的数据。#include <fstream> // for .原创 2022-03-03 12:07:02 · 4321 阅读 · 0 评论 -
❥关于C++之一些函数记录
`clock_t clock (void);`ANSI C和C++库中有一个函数有助于完成这样的工作。这个函数名为clock( ),返回程序开始执行后所用的系统时间。这有两个复杂的问题:首先,clock()返回时间的单位不一定是秒;其次,该函数的返回类型在某些系统上可能是long,在另一些系统上可能是unsigned long或其他类型。但头文件ctime(较早的实现中为time.h)提供了这些问题的解决方案。首先,它定义了一个符号常量:原创 2022-03-03 11:09:34 · 115 阅读 · 0 评论 -
❥关于C++之文件结尾及处理
如果输入来自于文件,则可以使用一种功能更强大的技术——检测文件尾(EOF)。C++输入工具和操作系统协同工作,来检测文件尾并将这种信息告知程序。检测EOF时将关闭对输入的进一步读取。乍一看,读取文件中的信息似乎同cin和键盘输入没什么关系,但其实存在两个相关的地方。首先,很多操作系统(包括Unix、Linux和Windows命令提示符模式)都支持重定向,允许用文件替换键盘输入。例如,假设在Windows中有一个名为gofish.exe的可执行程序和一个名为fishtale的文本文件,则可以在命令提示符模式原创 2022-03-03 10:16:34 · 4360 阅读 · 0 评论 -
❥关于C++之模板类vector、array VS 数组
模板类vector、array是数组的替代品。vector模板类vector类似于string类,是一种动态数组。基本上,它是使用new创建动态数组的替代品。实际上,vector类确实使用new和delete来管理内存,只是这种工作是自动完成的。vector是序列容器,表示可以改变大小的数组。与数组一样,vector使用连续的存储位置存储其元素,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,其效率与数组中的相同。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。效原创 2022-03-01 03:22:51 · 467 阅读 · 0 评论 -
❥关于C++之内存分成5个区&管理内存的3种方式
自动存储在函数内部定义的常规变量使用自动存储空间,称为自动变量(automatic variable)。自动变量是一个局部变量,其作用域为包含它的代码块。自动变量通常存储在栈中,这意味着执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量,即后进先出(LIFO)。因此,在程序执行过程中,栈将不断地增大和缩小。静态存储静态存储是整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种:1.在函数外面定义它;2.在声明变量时使用关键字static。..原创 2022-03-01 02:06:13 · 226 阅读 · 0 评论 -
❥关于C++之string类
相比于c-string,string类会让字符串方面的编程方便很多。定义typedef basic_string<char> string;字符串是表示字符序列的对象。标准字符串类通过与标准字节容器类似的接口为此类对象提供支持,但添加了专门设计用于处理单字节字符字符串的功能。string类是basic_string类模板的一个实例,该模板使用char(即字节)作为其字符类型,具有默认的char_traits和分配器类型(allocator types)(有关模板的更多信息,请参阅bas原创 2022-03-01 00:41:59 · 320 阅读 · 0 评论 -
❥关于C++之数组与指针
c-string字符串与指针char charr[20] = "My favorite color";char* str = "His favorite book";char* ps = new char[strlen(tmp) + 1];对于第1种表示法:常规数组表示法。对于第2种表示法:指针表示法。(char*是一种复合类型,是指向char的指针。)对于第3种表示法:动态内存分配。下面示例,打印charr、str、ps作为指针所指向的元素:char tmp[80];char char原创 2022-02-28 22:46:03 · 597 阅读 · 0 评论 -
❥关于C++之cin>>、cin.getline、cin.get提取字符串差异
cin>>cin是使用空白(空格、制表符和换行符)来确定字符串的结束位置,并清除遇到的空白缓冲;而字符串的开始位置是通过清除开头(若有)的空白缓冲来确定的。假设在键盘键入:\t\t\tAlistair \tDreeb<Enter>则输入缓冲区有:\t\t\tAlistair \tDreeb\n(关于缓冲输入,见Blog:关于C之缓冲输入)1. cin >> chArr0;// 键盘输入:\t\t\tAlistair \tDreeb<回车>。这时chAr原创 2022-02-27 07:39:04 · 914 阅读 · 0 评论 -
❥关于C++之C风格字符串
char cat[4] = {'c', 'a', 't', '\0'};cout << cat;// 打印:catchar dog[3] = ['d', 'o', 'g'};cout << dog;// 打印:dog€??由打印结果可知:c-string末尾是以’\0’结尾的,否则不是c-string!#include<cstring>// 使用strlen函数...char fish[] = "Bubbles";// 让编译器计算长度。末尾是有\0的!原创 2022-02-27 05:56:36 · 227 阅读 · 0 评论 -
❥关于C++之ASCII/Unicode/ISO10646及wchar_t/char16_t/char32_t
ASCII、Unicode、ISO 10646Unicode提供了一种表示各种字符集的解决方案——为大量字符和符号提供标准数值编码,并根据类型将它们分组。例如,ASCII码为Unicode的子集,因此在这两种系统中,美国的拉丁字符(如A和Z)的表示相同。然而,Unicode还包含其他拉丁字符,如欧洲语言使用的拉丁字符、来自其他语言(如希腊语、西里尔语、希伯来语、切罗基语、阿拉伯语、泰语和孟加拉语)中的字符以及象形文字(如中国和日本的文字)。到目前为止,Unicode可以表示109000多种符号和90多个原创 2022-02-27 05:17:30 · 829 阅读 · 2 评论 -
❥关于C++之程序执行流程
使用编辑器编写程序,并保存到文件中,这个文件就是程序的源文件。编译器编译源代码。这意味着运行一个程序,将源代码翻译为主机使用的内部语言——机器语言。包含了翻译后的程序的文件就是程序的目标代码(object code)。将目标代码与其他代码链接起来。C++库代码包含一系列计算机例程(被称为函数)的目标代码,这些函数可以执行诸如在屏幕上显示信息或计算平方根等任务。链接指的是链接程序将目标代码同使用的函数的目标代码以及一些标准的启动代码(startup code)组合起来,生成程序的运行阶段版本。包含该最..原创 2022-02-22 12:22:45 · 1745 阅读 · 0 评论