![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++学习
C++相关知识学习
努力是不想被淘汰
努力、学习
展开
-
STL map的value为类对象引发的构造函数
class Test{public: int a_; Test() { printf("默认构造函数 %p\n", this); } Test(int a){ printf("构造函数 %p\n", this); a_=a;} Test(const Test &test) { printf("拷贝构造函数 %p %p\n", this, &test); }原创 2021-11-20 17:14:09 · 689 阅读 · 0 评论 -
cmake和makefile的使用
一、cmake的安装cmake下载地址:https://cmake.org/download/选择Tools–>How to install Fow Command Line Usesudo "/Applications/CMake.app/Contents/bin/cmake-gui" --installcmake --version但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具(大多数IDE都有原创 2020-07-21 18:01:19 · 619 阅读 · 0 评论 -
C/C++ gcc编译过程
C/C++程序编译流程: 预处理->编译->汇编->链接具体的就是:源代码(source coprede)→预处理器(processor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→链接器(Linker)→可执行程序(executables)gcc常用选项:选项功能-v查看gcc 编译器的版本,显示gcc执行时的详细过程-o指定输出文件名为file,这个名称不能跟源文件名同名-E只预处理,不原创 2020-07-18 21:45:33 · 354 阅读 · 0 评论 -
C++11 线程池demo
线程池:一种线程的使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。线程池工作原理:1、主程序当前没有任务要执行,线程池中的任务队列为空闲状态.此情况下所有工作线程处于空闲的等待状态,任务缓冲队列为空.2、主程序添加小于等于线程池中线程数量的原创 2020-06-18 19:47:00 · 372 阅读 · 1 评论 -
函数指针指向静态成员函数、非静态成员函数、普通函数的使用
#include<iostream>using namespace std;class Test{public: //静态成员函数 static void func1(int i) {cout<<++i<<endl;} //非静态成员函数 void func2(int i) {cout<<--i<<endl;}};//普通函数void func3(int i){ cout&l原创 2020-05-22 14:00:53 · 652 阅读 · 1 评论 -
C语言实现多态(函数指针)
函数指针函数指针的实现方法:typedef int (*func)(int,int)function<int(int,int)> func#include <stdio.h>#include <stdlib.h>typedef void(*FUNC)(); //定义一个函数指针来实现对成员函数的继承struct _Base //父类{ FUNC _fun;//由于C语言中结构体不能包含函数,故借用函数指针在外面实现 int _B1;原创 2020-05-20 11:05:09 · 1216 阅读 · 0 评论 -
localtime-多线程不安全
#include<fstream>#include<iostream>#include <map>#include <unistd.h>using namespace std;void* Fun1(void *arg){ struct tm * tm= (struct tm*)arg; tm->tm_mday =...原创 2020-04-28 12:16:00 · 1075 阅读 · 0 评论 -
C++之RapidJSON解析json
{ "name":"zhangsan", "learn":{ "match":[ { "start":"08:00", "end":"10:00" }, { "start":"17:00", ...原创 2020-04-24 20:58:17 · 684 阅读 · 0 评论 -
C++因继承引起的内存消耗
#include<iostream>#include<vector>using namespace std;class A{public: int a; char c1; char c2;};//class B :public A{// char c2;//};int main(){ A a; cout&...原创 2020-04-19 20:09:11 · 226 阅读 · 0 评论 -
变量初始化顺序(静态变量、成员变量)
静态局部变量静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;静态成员变量C++中static成员变量的初始化顺序和声明的顺序不一致,和初始化语句的先后顺序...原创 2020-04-13 20:19:48 · 1177 阅读 · 0 评论 -
memcpy()、memset()注意事项
==【深度探索C++对象模型】==不管使用memcpy()还是memset(),都只有在“classes不含任何由编译器产生的内部members”时才能运行。如果这个类声明一个或者一个以上的virtual function,或者内含一个virtual base class,那么使用这两个函数将会导致那些“被编译器产生的内部members”的初值所改写。例如下面的声明:class Shape{ ...原创 2020-04-13 14:21:46 · 275 阅读 · 1 评论 -
c++为什么只能通过指针或引用实现多态,而不可以通过对象赋值实现
在c++的多态中,如果一个基类的虚函数被派生类重写,那么把基类的指针指向派生类,就能够通过基类调用被派生类重写的这个虚函数。(对于这点有疑问的,可以看我之前写的C++多态,虚函数,虚函数表,gcc下的单继承,多继承,虚继承的内存布局)。那么如果不用指针或引用会如何?#include<iostream>using namespace std;class Animal{public...原创 2020-04-01 17:21:29 · 963 阅读 · 0 评论 -
父类指针可以指向子类对象,反之则不可以
class A{public: A(int a){ this->a=a; } int a;};class B:public A{public: B(int a,int b):A(a){ this->b=b; } int b;};A类占内存大小范围:int a; 占4个字节.B类占内存大小范围...原创 2020-04-01 15:31:18 · 1001 阅读 · 1 评论 -
C++创建类对象的生命周期
全局对象在main开始前被创建,main退出后被销毁。#include <iostream>using namespace std;class A{public: A() { cout<<"执行构造函数"<<endl; } ~A(){ cout<<"执行析构函数"<<...原创 2020-01-10 16:50:38 · 1659 阅读 · 0 评论 -
C++标准指明析构函数不能、也不应该抛出异常
出现异常会执行析构函数C++异常处理模型是为C++语言量身设计的,更进一步的说,它实际上也是为C++语言中面向对象而服务的。C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持。那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源, 这就是调用这些对象的析构函...原创 2019-12-31 15:55:23 · 394 阅读 · 0 评论 -
C++ explicit和implicit (显示转换和隐示转换)
在C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即被explicit关键字修饰的类构造函数,不能进行自动地隐式类型转换,只能显式地进行类型转换。首先, C++中的explicit关键字只能用于修饰只有一个参数或只有一个未提供默认值的类构造函数, 它的作用是表明该构造...原创 2019-11-28 17:42:56 · 522 阅读 · 0 评论 -
C++中NULL和nullptr的区别
NULL在c++中是一个宏,是一个空指针常量,如果将NULL扩展为常数,那么这个数是0,类型为int。#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif在C语言中,NULL的定义为(void *)0,因为C语言可以隐式转换。但在C++中,int *p = (void ) 0这样的语句会报错,因为在C+...原创 2019-11-17 20:09:41 · 126 阅读 · 0 评论 -
C++多态案例
案例:当基类A中的虚函数f2()被基类的成员函数f1()调用,在派生类B中实现函数f2()的多态,在main()函数中定义一个类B的对象b,执行b.f1(),查看结果。#include <iostream>#include<map>using namespace std;class A{public: void f1(){ f2();...原创 2019-09-04 00:21:19 · 385 阅读 · 0 评论 -
C++调用C#动态库
一、编写C#的.dll文件namespace Mylib{ public class Test { [DllExport("Testdll", CallingConvention = CallingConvention.Cdecl)] public static unsafe string Testdll(int** obj) ...原创 2019-09-04 23:18:54 · 3905 阅读 · 0 评论 -
C++中strcpy 和 strcpy_s的区别
之所以说strcpy_s比strcpy安全是因为strcpy需要程序员去保证输出buffer不会越界。原创 2019-09-06 23:44:27 · 2717 阅读 · 0 评论 -
C++中为什么需要将基类的析构函数设置为虚函数
大家知道,析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为vitual有什么作用呢?直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生...原创 2019-09-26 11:49:29 · 1051 阅读 · 0 评论 -
C++中为什么构造函数不能为虚函数
为什么构造函数不能声明为虚函数?1.创建一个对象必须明确指出它的类型,否则无法创建,一个对象创建成功编译器获得它的实际类型,然后去调用对应的函数,而如果构造函数声明为虚函数,会形成一个死锁,虚函数是在运行才能确定确定其调用哪一个类型的函数,而具体哪一个类型是编译器通过对象的类型去确定的,但是此时对象还未创建也就没法知道其真实类型。class A{public: virtual A(){};...原创 2019-09-26 14:18:18 · 1595 阅读 · 1 评论 -
C++中#pragma once与#ifndef条件编译区别
为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:1)#ifndef方式#ifndef __SOMEFILE_H__#define __SOMEFILE_H__... ... // 声明、定义语句#endif2)#pragma once方式#pragma once... ... // 声明、定义语句两者区别:1)#ifnde...原创 2019-09-03 23:45:12 · 651 阅读 · 0 评论