c++
迪迦 • 奥特曼
C/C++ coder
展开
-
C++中控制cout输出两位小数点精度(显示固定位数十六进制数,前面补零)
使用cout输出时,想要控制输出的格式,比如显示两位小数、显示十六进制数、全部显示大写字母、输出十六进制数时带0x,这些都可以用标准函数库std中的setf()来完成,即使用cout.setf()。当然,如果显示十六进制数,也可以使用std::hex来控制。下面对函数cout.setf()原型进行讲解和给出两个简单例子,第一个例子是显示两位小数,第二个例子是显示固定位数十六进制数,不足位数补零。函数fmtflags setf(fmtflags _Newfmtflags, fmtflags _Mask)有两转载 2022-06-25 07:33:58 · 6546 阅读 · 0 评论 -
类型从属名称的使用必须以“typename”为前缀
为了方便测试,写了一个通用的迭代器打印模板,如下:问题描述本来觉得没什么问题,可是运行之后却报出了如下的错误:首先,错误信息说const_iterator这个类型是一个从属名称,而类型从属名称要以typename为前缀。那什么是从属名称呢?从属名称: template内出现的名称,如果依赖于template中的参数,那么它就是一个从属名称。而如果它同时又嵌套与模板参数中,那么它就是一个嵌套从属名称。拿本题举例,const_iterator是模板中出现的名称,同时又依赖于模板参数Con,同时const_i转载 2022-06-22 09:10:14 · 838 阅读 · 0 评论 -
C++ 成员函数做友元——错误问题:类型未定义
这篇文章主要解决在对类进行友元函数的声明时,关于友元类的成员函数只能用指针访问的解释。先看一段代码:这段代码的意图主要是希望在Buiding类中对GoodGay类的成员函数Visit1进行友元函数说明,让Visit1成员函数可以访问Building类中的私有成员,但是不让Visit2成员函数访问Building类中的私有成员。这就需要单独对GoodGay类的成员函数进行友元声明。但是在进行使用时,作者发现一个问题,为什么只能用指针进行对对象进行访问,实例化一个对象直接访问不可以吗?于是乎,有了下面的问题转载 2022-06-10 16:37:04 · 2029 阅读 · 5 评论 -
C++中的friend详细解析
C++中的友元机制允许类的非公有成员被一个类或者函数访问,友元按类型分为三种:普通非类成员函数作为友元,类的成员函数作为友元,类作为友元。友元包括友元的声明以及友元的定义。友元的声明默认为了extern,就是说友元类或者友元函数的作用域已经扩展到了包含该类定义的作用域,所以即便我们在类的内部定义友元函数也是没有关系的。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普转载 2022-06-10 16:32:57 · 329 阅读 · 0 评论 -
C++ getline函数用法详解
虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题。当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。以下面的语句为例:可以输入 “Mark” 或 “Twain”,但不能输入 “Mark Twain”,因为 cin 不能输入包含嵌入空格的字符串。下面程序演示了这个问题:程序输出结果:请注意,在这个示例中,用户根本没有机会输入 city 城市名。因为在第一转载 2022-06-09 08:02:45 · 5569 阅读 · 0 评论 -
C++重载流运算符,将存储结构体的vector直接写入文件
我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢?采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次性写入,存储struct的vector也是可以的,这里举一个简单的例子,声明结构体:写一个类封装流运算符:这里需要注意,重载流运算符的函数应设为友元函数,因为类的成员二元运算符重载要求运算符左操作数为运算符函数的第一个参数,而流类库中的>>则要求第一个参数为ostream的引用,所以不能作为类成员,只能作为友转载 2022-06-08 07:47:49 · 3022 阅读 · 3 评论 -
错误C1083无法打开预编译头文件: “Debug\XXX.pch”: No such file or directory 的解决方法
错误C1083无法打开预编译头文件: “Debug\XXX.pch”: No such file or directory问题起因:在项目(project)里将所有.h、.cpp文件移除,重新添加后编译出现上述错误。网上搜了一番,有两种解决办法:1、将项目设置成不使用预编译头。2、将项目设置成创建预编译头。以上两种方法都可行,但是为什么之前的就能正常编译呢?重新添加头文件/源文件之后就要修改项目属性?于是对比了一下前后两个项目文件,发现一下变化,左边是之前的,右边是后来编译提示错误的。原来重转载 2022-03-04 17:59:52 · 11156 阅读 · 0 评论 -
多字节编码与Unicode码的区别
多字节字符与宽字节字符char与wchar_t我们知道C++基本数据类型中表示字符的有两种:char、wchar_t。char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节。一个英文字符(如’s’)用一个char(一个字节)表示,一个中文汉字(如’中’)用3个char(三个字节)表示,看下面的例子。void TestChar(){ char ch1 = 's'; // 正确 cout <<转载 2022-02-25 10:05:11 · 1082 阅读 · 2 评论 -
C++运算符的重载样例
#include <iostream>using namespace std;class Point { friend Point operator+(const Point& p1, const Point& p2); friend Point operator-(const Point& p1, const Point& p2); friend bool operator==(const Point& p1, const Point&a原创 2022-02-12 00:02:43 · 378 阅读 · 0 评论 -
C++中的static 成员变量的一些注意点
C++中的static成员变量主要用来为多个对象共享数据例:#include <iostream>using namespace std;class Student{public: Student(char *name, int age, float score); void show();private: static int m_total; //静态成员变量private: char *m_name; int m_age; f转载 2022-02-04 22:05:03 · 129 阅读 · 0 评论 -
更改引用类型之再次开次开辟内存空间
仅供个人记录学习,为个人学习笔记。请下面两段代码:代码一int age = 10;const int& ref = age;age = 20;cout << age <<":"<< ref<<endl;代码二:int age = 10;const long& ref = age;age = 20;cout << age <<":"<< ref<<endl;这两段代码分别原创 2022-02-02 10:59:45 · 573 阅读 · 0 评论 -
float在计算机的存储方式
1、float类型数字在计算机中用4个字节(32位)存储。遵循IEEE-754格式标准:一个浮点数由3部分组成:符号位s(1位)和、指数e(8位)、底数m(23位)2、格式SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMMS:符号位E:指数,十进制指数加上127后的值得二进制数据M:底数3、符号位指底数的符号,可正可负。4、指数根据浮点数的存储标准(IEEE制定),float类型指数的起始数为127(二进制0111 1111),double类型指数的起始数.转载 2022-01-16 09:10:05 · 8772 阅读 · 1 评论 -
有符号类型的最小负数的补码的由来
一、 16位的有符号整数(int)在计算机中是用补码存储数据 为什么不用原码存 就是因为原码表示不了最小值-32768如果是原码表示的话,编码中+0是用16个0表示,-0是用1后跟15个0表示但是由于+0等于-0所以相当于多花了一个编码来编码0那么用补码会怎样补码+0编码出来是16个0-0 = [1000 0000 0000 0000]原 = [1111 1111 1111 1111]反 = [(1)0000 0000 0000 0000]补其中1溢出不管了 剩下的是16个0与+0编码相同这转载 2022-01-16 00:14:25 · 1152 阅读 · 1 评论 -
VS系例引入lib采用__FILE__宏
在读代码的时候,发现有这样的写法,开始很不理解。#ifndef _LIBPATH_#define _LIBPATH_(p,f) p##f#endif# ifdef _UNICODE# ifdef _DEBUG# pragma comment(lib, _LIBPATH_(__FILE__, "/../Lib/DuiLib_ud.lib"))# else# pragma comment(lib, _LIBPATH_(__FILE__, "/../Lib/DuiLi原创 2022-01-12 08:44:45 · 266 阅读 · 0 评论 -
VSCode回车换行后自动调整代码格式
VSCode回车换行后自动调整代码格式(如运算符两侧加空格)VSCode Version:1.50.1设置里面已经没有json模式编辑了(我找了好久没找到)在VSCode设置中搜索 “Format On Type”,然后再勾选 Editor: Format On Type前的框即可。...转载 2021-05-02 11:34:12 · 1841 阅读 · 0 评论 -
什么时候需要curl_global_init()
在开发libcurl程序中,发现有时候显示调用curl_global_init或不显示调用curl_global_init(都可以,那这个原因是?这个功能是否必要?官方文档:This function must be called at least once within a program (a program is all the code that shares a memory space) before the program calls any other function in libc转载 2021-03-24 17:08:49 · 1992 阅读 · 1 评论 -
c++11多线程与线程池
最近需要开发一个高性能计算库,涉及到c++多线程的应用,上次做类似的事情已经是4年多以前了,印象中还颇有些麻烦。悔当初做了就算了,也没想着留点记录什么的。这次又研究了一番,发现用上c++11特性之后,现在已经比较简单了,在此记录一下。最简单的多线程情况,不涉及公共变量,各个线程之间独立运行,主线程只负责传入参数并接收运行结果。这种情况也是多线程性能最好的场景,因为不涉及锁的问题。之前c++标准库对多线程支持并不好,要么用boost线程库,要么用操作系统提供的线程自己轮。自从c++11之后,标准库对多线程支转载 2021-03-23 23:38:44 · 185 阅读 · 0 评论 -
std::condition_variable notify_one()与notify_all()的区别
notify_one()与notify_all()常用来唤醒阻塞的线程,线程被唤醒后立即尝试获得锁。notify_one()因为只唤醒一个线程,(这个被唤醒线程一般是队列的第一个线程,这个结论是我自己做实现后感觉的,如果不对,请大家指出来,我更改哈)不存在锁争用,所以能够立即获得锁。其余的线程不会被唤醒,需要等待再次调用notify_one()或者notify_all()。notify_all()会唤醒所有阻塞的线程,存在锁争用,只有一个线程能够获得锁。那其余未获取锁的线程接着会怎么样?会阻塞?还是继续转载 2021-03-23 16:26:43 · 397 阅读 · 0 评论 -
std::async介绍与实例
本节讨论下在C++11中怎样使用std::async来执行异步task。C++11中引入了std::async什么是std::asyncstd::async()是一个接受回调(函数或函数对象)作为参数的函数模板,并有可能异步执行它们.template<class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn,转载 2021-03-22 18:57:49 · 187 阅读 · 0 评论 -
左值引用和右值引用
在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。 举个例子,int a = b+c, a就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。左值一定在内存中,右值有可能在内存中也有可能在寄存器中int a=5;int b=a;//此时a在内存中int a=5;int b=a+1;//此时a转载 2021-02-04 12:26:38 · 189 阅读 · 0 评论 -
vcpkg win10下编译zlib失败
依赖zlib 编译报错如下:修改: vcpkg\ports\zlib\portfile.cmake重新编译通过转载 2021-01-31 20:29:10 · 436 阅读 · 0 评论 -
如何使用 Visual Studio 管理和阅读开源项目代码
对于 Linux C/C++ 项目,虽然我们在 Linux 系统中使用 gdb 去调试,但是通常情况下对于 C/C++ 项目笔者一般习惯使用 Visual Studio 去做项目管理,Visual Studio 提供了强大的 C/C++ 项目开发和管理能力。这里以 redis 源码为例,介绍一下如何将这种开源项目整体添加到 Visual Studio 的解决方案中去。启动 Visual Studio 新建一个空的 Win32 控制台程序。(工程建好后,关闭该工程防止接下来的步骤中文件占用导致的无法移动。转载 2020-10-23 11:37:24 · 2023 阅读 · 0 评论 -
为什么C++中复制构造函数可以调取其他对象中的私有变量
私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量.然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明:样列1:疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误?class CTest {public: CTest(int i); CTest(const CTest& rhs);转载 2020-08-05 21:44:21 · 705 阅读 · 0 评论 -
又见VC6.0奇怪的报错
VC6啊,真是个又爱又恨的东西啊,很小巧,基本功能都可以实现,非常方便的实现远程安装和教学,让初学者入门,但是又有很多BUG,没有被更新。又见VC6.0奇怪的报错首先给出报错的代码:Array<LinkedList<Object*>> array;Objecte是一个类,具体、抽象无关紧要,Array与LinkedList分别为数组模板类和链表模板类。那么这行代码的意思就是定义一个数组,数组元素链表,链表中的节点为Object类的指针。报错为:d:\templat.转载 2020-07-28 09:45:50 · 1249 阅读 · 0 评论 -
C++获取一个整数
// 获取一个整数int getInt(int min, int max){ int k; cin >> k; while (true){ if (k <min || k > max){ cin.clear(); cin.ignore(100, '\n'); cin >> k; continue; } break; } return k;}原创 2020-07-01 17:18:30 · 749 阅读 · 0 评论 -
C++虚函数部分
这个是在最近调一个bug的时候,出现的,注意不是同一个类中的多态是不能使用的,如果在两个程序中,如一个DLL,一个exe中,两个即使类名一样,类的相关属性也一样,但是也不能交互使用。#include <iostream>using namespace std;class A{public: virtual void fun2() = 0; virtual void fun() = 0;};class B{public: virtual void fun(){}; vir原创 2020-05-21 11:42:12 · 191 阅读 · 0 评论 -
c++中虚继承的作用
在c++中虚继承的作用主要是在多重继承的问题上防止二义性的产生。 但是具体什么是虚继承呢?就是在被继承的类前面加virtual关键字,这时候被继承的类就叫做虚基类。 具体请看下面的代码。class Person;class Son1 :virtual public:Person;class Son2: virtual public:Person;class Son3:public Son1,public Son2;如果代码像上面这样声明的话就不会产生二义性。请看下面代码:#inc转载 2020-05-21 09:44:46 · 382 阅读 · 0 评论 -
C++11获取线程的返回值 - std::future and std::promise
在许多时候,我们会有这样的需求——即我们想要得到线程返回的值。但是在C++11 多线程中我们注意到,std::thread对象会忽略顶层函数的返回值。 那问题来了,我们要怎么获得线程的返回值呢? 我们通过一个例子来说明如何实现这个需求。 假设我们的app会创建一个线程来压缩一个文件夹,该线程在压缩完文件夹后会返回压缩文件 *.zip 和这个zip文件的大小,我们现在就想获得这个线程的返回值。 有两种方法可以实现这个需求:传统的方法:在线程间共享指针 传递一个指针给压缩文件的线程,转载 2020-05-13 16:36:33 · 2194 阅读 · 0 评论 -
用C++11的std::async代替线程的创建
c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的:void f(int n);std::thread t(f, n + 1);t.join(); 但是线程毕竟是属于比较低层次的东西,有时候使用有些不便,比如我希望获取线程函数的返回结果的时候,我就不能直接通过thread.join()得到结果,这时就必须定义一个变量,在线程函数中去给这个变量赋值,然后join,最后得到结果,这个过程是比较繁琐的。 c++11还提供了异步接口std::async,通过这个异步接口转载 2020-05-13 15:52:25 · 315 阅读 · 0 评论 -
C++处理头文件互相循环包含,导致变量或类未定义
先说解决办法:第一种方法把用到的那个变量或类单放置在一个头文件里面。第二种方法在报错的的文件中添加这个报错变量的定义,如class A;原理 这样做的原理其实很简单,只是因为在C++中,include头文件只是把文件展开后添加到源代码中,如果你一项一项的展开后,就会发现报错的变量真的没有定义,展开分析即可。 注意:在进行展开分析时,不要只对两个互相包含的头文件展开,还要展开其他的包含这个头文件的文件,所以,如果工程比较大的话,展开还不是很容易,所以,可以自己写一个小的Demo进行测试原创 2020-05-10 11:19:48 · 1364 阅读 · 0 评论 -
浅析C++11右值引用和move语义
右值引用是C++11中新引入的概念,该方法是为了支持移动而引入的额一个新的引用类型。本文将以最简洁的描述来介绍右值引用和move语义的基本概念。我们通常见到的引用(int &a=b;)可以称之为左值引用,而右值引用则是int &&a的形式。右值引用的一个重要性质和作用就是只能绑定到一个将要销毁的对象,因此我们可以将右值引用的资源移动到另一个对象中,下面将具体解释其含义辑...转载 2020-04-22 21:41:16 · 328 阅读 · 0 评论 -
C++子类和父类指针的转换-dynimic_cast
C++子类和父类指针的转换,推荐使用dynamic_cast,需要注意的是,其实在C++里面还有其他的转换方式,这里先不做探究。我们在这里只做两个比较,分另是括号强制转换和dynimic_cast两个。 先抛出结论,只有在父类或子类有虚函数的时候,用```dyniamci_cast```...原创 2020-04-22 15:51:03 · 3485 阅读 · 0 评论 -
网络编程这结构体发送
client#define _WINSOCK_DEPRECATED_NO_WARNINGS#define _CRT_SECURE_NO_WARNINGS#include <winsock2.h>#include <windows.h>#include <stdio.h>#include <memory>#pragma pack(1)...原创 2020-03-07 15:11:27 · 298 阅读 · 0 评论 -
关于内存对齐的几点记忆
内存对齐的四大规则:第一个成员在与结构体变量偏移量为0的位置处。其他成员变量要对齐到某个数字(对其数)的整数倍的地址处。对其数=编译器默认的一个对齐数与该成员大小的较小者。vs中默认的值是8Linux中默认的值是4结构体总大小为最大对其数(每一个成员变量都有一个对其数)的整数倍。如果嵌套了结构体对齐到自己的最大对其数是整数倍处,结构体的整体大小就是最大对齐数(含嵌套结构体的对...转载 2020-03-02 17:37:57 · 225 阅读 · 1 评论 -
C++中创建对象的时候加括号和不加括号的区别
c++创建对象的语法有在栈上创建 MyClass a;在堆上创建加括号 MyClass *a= new MyClass();在堆上创建不加括号 MyClass *a = new MyClass;MyClass a();声明了一个返回值为MyClass类型的无参函数。注: 第4条不会实例化一个对像,只是一个函数的声明,一定要注意区分啊。代码验证:#include...转载 2020-02-16 19:45:42 · 716 阅读 · 0 评论 -
C++的运算符的重载的记录
整体感受C++真的是门很怪的语言啊,很多的语言细节都不能掌握,只能说是很奇怪了。以下所有内容,都是个人的看法,不是很全面,如果有相关的问题,请在下面留言哈,我再补充,谢谢。另一点就是所有的代码我贴的都是全部的代码,为了方便各位同学运行,但都不长。对于运算符的重载,有以下以下几项注意点:对于一个符号重载函数,在成员函数中,它的参数个数最多为一个,也就是说,成员函数重载的运算符的参数,可以...原创 2020-02-16 19:36:44 · 206 阅读 · 0 评论 -
关于C++全局重载运算符的两点注意
全局运算符重载要注意函数的声明全局运算符重载中的等号是浅拷贝,并非深拷贝。代码如下:#include <iostream>using namespace std;class Person;Person operator+(const Person &p1, const Person &p2); // 注意函数的声明class Person{pub...原创 2020-02-03 15:29:02 · 671 阅读 · 0 评论 -
VC静态库的调试
VC静态库的调试背景对于动态库或者可执行程序而言,如果想要调试只要将对应的pdb文件和动态库或者可执行文件放在一起即可自动加载符号。众所周知静态库在最终链接的时候是把代码直接链接到最终的生成文件里的。这就决定了不可能把静态库的pdb文件和生成文件放在一起来调试。所以我们想要调试静态库,肯定需要一些特殊的操作。那么,对于静态库调试,具体该怎么做呢?静态库的pdb文件首先我们确定一件事,静...转载 2019-12-08 18:44:29 · 514 阅读 · 0 评论 -
VS2015类向导“异常来自 HRESULT:0x8CE0000B”错误解决方法
关闭项目在工程目录找到.vc.db文件删除转载 2019-11-21 15:17:37 · 765 阅读 · 0 评论 -
在VS中添加lib库的三种方法
方法1: 通过设置工程配置来添加lib库.A、添加工程的头文件目录:工程—属性—配置属性—c/c+±–常规—附加包含目录:加上头文件存放目录。B、添加文件引用的lib静态库路径:工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。C 然后添加工程引用的lib文件名:工程—属性—配置属性—链接器—输入—附加依赖项:加上lib文件名。这种方法比较繁琐,且不直观,而且还可...转载 2019-11-14 12:37:42 · 412 阅读 · 0 评论