C/C++
C/C++
L7256
这个作者很懒,什么都没留下…
展开
-
C++类函数转函数指针
【代码】C++类函数转函数指针。原创 2022-10-21 12:59:02 · 915 阅读 · 0 评论 -
strncpy和strcpy和memcpy
但memcpy会把字符的 0 和\0一起拷贝到buffer里,用%s打印依旧会打不出 789a,strncpy的源码也是依据0的结束符来判断是否拷贝完成,只是限定了拷贝的个数。但memcpy会根据个数来定需要拷贝多少字节,不会因为0而不拷贝。上面的方案都有毛病,那解决方案就是memcpy。拷贝abc到str数组,能正常输出。如上,结果为ab ,并没有被完全拷贝。原创 2022-09-30 00:28:53 · 451 阅读 · 0 评论 -
虚函数的实现及继承
虚函数的实现:关键字:虚函数表,虚函数表的指针。(1)一个类会产生一堆指向虚函数的指针,这些指针被统一的放在一个数组里面,这个数组也叫虚函数表(又叫vtbl)(2)每实例化一个对象,系统内部会添加一个虚函数表的指针(又叫vptr),通常放在这个类中内存的最前面。(3)每个有虚函数的类都有自己的虚函数表,没有虚函数这个类就没有虚函数表。(4)如果父类有一个虚函数A,子类override虚函数A,那么这个方法将被覆盖。在子类转成父类的时候,再调用虚函数A,会执行子类的虚函数A当虚函数遇上原创 2022-05-16 23:23:29 · 1742 阅读 · 0 评论 -
左值,右值,移动拷贝构造
参考:C++11右值引用和移动构造函数详解 - 知乎 左右值基本概念“左值”能出现在赋值号左边的表达式。不能出现在赋值号左边的表达式称为“右值”。int a;a = 10; //a就是左值,10就是右值。一般的“引用”都是引用变量的,而变量是左值,因此它们都是“左值引用”。int a;int &b= a; // b是左值,加上引用&, int &b称左值引用。b = 10;右值引用可以让无名的临时变量出现在赋值操作的左边。定义右值格式如下...原创 2022-05-16 22:46:41 · 423 阅读 · 0 评论 -
C++ std::bind函数
std::bind();就是用来包装函数,并且可以指定传入几个参数。。。看下面的例子就明白了placeholders: 占位符,代表第几个参数,比如placeholders::_1代表第一个参数。 std::bind()返回值是函数指针,并且通过std::bind();传入的参数可以确定有函数指针的形式。这样完成了对一个想要的函数的封装。#include <iostream>#include <functional>using namespace std;vo原创 2022-04-17 15:09:49 · 2134 阅读 · 0 评论 -
指针作为参数传递
首先:下面的例子发现有如下结果和代码,发现传入的str参数值并没有改变。于是对指针的传递产生了疑问?GetMemory(char *p, int num)传递的p指针是传递的str的地址,还是传递的str的内容((char *)malloc(sizeof(char) * 10)返回的指针)呢?zion6135@zion6135-VirtualBox:~/Desktop$ ./a.out--1--1707778720--2--1707779792--3---1707778720#include原创 2022-03-08 15:51:19 · 318 阅读 · 0 评论 -
C++ weak_ptr
weak_ptr指向一个shared_ptr指向的对象,且不会改变对象的引用计数。 weak_ptr不控制所指对象的生命周期。if (a = x)只要x不为0,那么这个if就为真,比如下面的结果打印为 22int main() { if (int a = 0) { std::cout << "===11===" << std::endl; } if (int a = 1) { std::cout << "原创 2022-01-20 16:36:36 · 720 阅读 · 0 评论 -
C++ std::lock_guard和std::unique_lock
std::lock_guard// g++ main.cpp -lpthread#include <algorithm>#include <condition_variable>#include <list>#include <mutex>#include <queue>#include <thread>int main() { { std::mutex m; std::.转载 2022-01-19 17:55:38 · 1199 阅读 · 0 评论 -
C++ 模板类的继承
模板类:template <typename T> 说白了就是向之后的内容传递参数类型,把T当作一个数据类型传递,而在声明一个变量的时候,通过base <xxxx> pp; xxx就是传入后面类的数据类型。// 1.普通template类template <typename T1> class base{public: T1 a;};// 普通类class base00{public: int e;};// 2.Base和Deri原创 2022-01-18 15:08:14 · 2797 阅读 · 1 评论 -
C++ new/delete的重载
类中的new/delete重载#include <iostream>#include <new>class A {public: void *operator new(size_t size) { printf("%d=====1\n", sizeof(size)); return ::operator new(size); }; void operator delete(void* ptr) {原创 2022-01-17 20:38:39 · 361 阅读 · 0 评论 -
C++ 函数后加throw()
void GetTag() throw(int);表示只抛出int类型异常void GetTag() throw(int,char);表示抛出in,char类型异常void GetTag() throw();表示不会抛出任何类型异常void GetTag() throw(...);表示抛出任何类型异常void GetTag() throw(int);表示只抛出int类型异常...转载 2022-01-17 17:30:17 · 154 阅读 · 0 评论 -
C++ std::function
参考:C++11 function类模板_青山绿水-CSDN博客_c++ function调用普通函数 #include <functional> #include <iostream> int f(int a, int b) { return a+b; } int main() { std::function<int(int, int)>func = f; c原创 2022-01-17 11:01:23 · 149 阅读 · 0 评论 -
C++模板特化,偏特化,全特化
全特化,模板特化,全特化有如下例子template<typename T1, typename T2>class Test{public: Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;}private: T1 a; T2 b;}; template<>class Test<int , char>{public: Test(int i, char j):a(i),b(j转载 2022-01-16 16:38:13 · 69 阅读 · 0 评论 -
C++ 函数模板与类模板
(1)函数模板参考:C++函数模板5分钟入门教程 在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。值(Value)和类型(Type)是数据的两个主要特征,它们在C++中都可以被参数化。 模板函数的语法:template <typename 类型参数1 , typename 类型参数2 , ...>返回值类型 函数名(形参列表){ //在函数体中可以使用类型参数...原创 2022-01-16 16:05:11 · 68 阅读 · 0 评论 -
C++ shared_ptr的reset 用法
#include <iostream>#include <memory>class Tmp{public: Tmp(int a); ~Tmp();private: int __a;};Tmp::Tmp(int a):__a(a){ std::cout << "start" << __a << std::endl;}Tmp::~Tmp(){ std::cout << "fin.原创 2022-01-14 16:22:44 · 10752 阅读 · 0 评论 -
C++的四种转换运算符
C++有四种自带的转型操作参考:C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)、语法格式:xxx_cast<newType>(data) 将data转换为newType,根据data的不同对应xxx_cast static_cast:static_cast 不能用于无关类型之间的转换,static_cast 是“静态转换”的意思,也就是在编译期间转换,转换失败的话会抛出一个编译错误。//老式转.原创 2022-01-14 14:05:40 · 244 阅读 · 0 评论 -
operator重载
格式返回值类型 operator 运算符名称 (形参表列){ //TODO:}operator是关键字,专门用于定义重载运算符的函数。我们可以将operator 运算符名称这一部分看做函数名。类中的重载#include <iostream> using namespace std; class person{private: int age;public: person(int nAge) { this->原创 2022-01-13 19:40:16 · 1267 阅读 · 0 评论 -
C++静态动态类型
静态类型的类变量:在编译时就已经知道是什么类型的了 动态类型的类变量:自己所指的类型不明确,直到运行时才知道 如果表达式既不是引用也不是指针,那么其就没有静态类型和动态类型的概念,因为其只能与自己类型一致的对象绑定到一起class A {};class B:public A{}; int main(){ A a; //静态类型 B b; //静态类型 A *p; //动态类型,因为指针可以修改指向的对象 p = &a; //p指向了a..原创 2022-01-11 11:43:45 · 262 阅读 · 0 评论 -
C++类中变量的初始化顺序
关于变量的初始化顺序,需要先明白:声明,定义,初始化,赋值。变量声明:extern int a;//只声明一下这个变量,会在别处定义的变量定义 :int a;//说明该变量在内存中的位置和大小,定义变量初始化:int a = 7;//定义时给变量一个值赋值:a = 7; 构造函数的初始化 构造函数中的变量赋值 class A{public: A(){ n1 = 1; n2 = 2; .原创 2022-01-09 14:53:44 · 278 阅读 · 0 评论 -
指针的理解
参考:C语言指针变量的定义和使用(精华)数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为 指针变量 。 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是http://c.biancheng.net/view/1991.html指针是一种比较奇怪的数据类型,先说int, float, char这些类型很好理解,比如int a = 100; 代表有一个内存地址(&a),内存里面存的数(a)是100。 int a = 100;in原创 2022-01-08 14:27:18 · 313 阅读 · 0 评论 -
shared_ptr自定义删除器 Deleter
自定义共享指针用于执行类似析构函数的操作#include <iostream>#include <memory>struct Sample{ Sample() { std::cout << "Sample\n"; } ~Sample() { std::cout << "~Sample\n"; }};void deleter(Sample * x){ std::cou.原创 2022-01-05 20:03:47 · 1102 阅读 · 0 评论 -
函数指针转换
#include <iostream>#include <memory> int aa (int a) { std::cout << a <<"destory A\n";}int main(){ void *pVoid = (void*)aa; //函数指针转为void*指针 int(*GetInputEvent)(int); /*定义函数指针 */ GetInputEvent = (int (*)(int))pVoid; //v.原创 2022-01-05 17:45:40 · 807 阅读 · 0 评论 -
C++资源管理
1.利用对象管理资源的思想:类在构造的时候分配资源,在析构的时候释放资源。void *add(void* args){ sleep(1); for(int i = 0; i < TASK_CNT; ++i){ //显示加锁, 解锁 pthread_mutex_lock(&lock); g_num++; //如果return, break, 则不能释放锁 pthread_mut原创 2022-01-05 18:14:54 · 673 阅读 · 0 评论 -
C++ virtual 析构函数
case 1#include <iostream>using namespace std; class Base{ public: ~Base() {cout<<"~B"<<endl;}}; class Derived:public Base{ public: ~Derived() {cout<<"~D"<<endl;}}; int main (){ Base *b = new Derived; /原创 2022-01-04 11:34:18 · 527 阅读 · 0 评论 -
C++之用std::nothrow
new(std::nothrow)"在分配内存失败时会返回一个空指针。便于问题的排查与解决。如果用new 在分配内存失败会触发std::bad_alloc的异常,如果没有写异常处理,程序会crash。原创 2021-12-16 16:15:28 · 1028 阅读 · 0 评论 -
虚函数与继承
参考:C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现class Base1{public: int base1_1; int base1_2; virtual void base1_fun1() {} virtual void base1_fun2() {}}; class Derive1 : public Base1{public: int derive1_1; int derive1_2; // 覆盖基类.原创 2021-12-11 17:38:12 · 185 阅读 · 0 评论 -
虚函数,虚函数指针,虚函数表在内存的分布
在c++中,对于一个不含虚函数的类,它的大小为变量的大小,不包含在类里面的非虚函数。case 1:类中只有变量class Base1{public: int base1_1; int base1_2; // void foo(){}};比如对于Base1来说,有无foo()函数,sizeof(Base1)的大小都为8,说明类自身的函数不计入类的大小,其实也很合理,比如定义10个Base1,但这10个Base1用的是同一个方法,这样可大大的节约类占的内存。cas原创 2021-12-11 17:21:31 · 874 阅读 · 0 评论 -
C语言实现C++的多态
编译时的多态性:编译时的多态性是通过重载函数来实现的。运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C++中,运行时的多态性通过虚成员实现。参考:https://blog.csdn.net/wenqiang1208/article/details/76244628https://blog.csdn.net/wenqiang1208/article/details/76244628C++ 多态:func()函数 传入子类指针,形参是父类。#include原创 2021-11-05 18:42:59 · 1305 阅读 · 0 评论 -
C++中虚析构函数
参考:C++中的动态类型与动态绑定、虚函数、运行时多态的实现_IIcyZhao's Road-CSDN博客参考:C++中虚析构函数的作用及其原理分析_哒哒的博客-CSDN博客_虚析构函数的作用动态绑定与静态绑定动态绑定:就是基类的指针或引用有可能指向不同的派生类对象。对于非虚函数,执行时实际调用该函数的对象类型即为该指针或引用的静态类型(基类类型)只有虚函数才能进行动态绑定,非虚函数不进行动态绑定。#include<iostream>using namespace s原创 2021-10-26 02:21:05 · 119 阅读 · 0 评论 -
shared_ptr和unique_ptr
唯一指针 unique_ptr:通过实现new,可不用去手动调用delete从而即可在当前的作用域内自动回收内存。例子如下,可以不用手动调用delete.此外unique_ptr不支持以下的操作方式: unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr&) = delete;下述例子,在退出作用域时,唯一指针会调用析构函数,从而实现内存回收。......原创 2021-10-24 23:58:33 · 846 阅读 · 0 评论 -
C++类中的const和mutable
当类中的方法之后加上const代表这个方法中的类中的变量不可以被修改,如果需要修改类中的变量,需要在变量前加上mutable ;那么这个变量在类的const方法中可以被修改。class A {public: int a;void test() const { a = 10; // 错误,因为const方法中的类中的变量不可被修改。}};就像这样:class A {public: mutable int a;void test() const { a原创 2021-10-24 00:47:50 · 164 阅读 · 0 评论 -
C++程序编译的四个过程
先讲讲整体流程:预编译---->编译---->汇编----->链接。以下面这几个文件为例子!!/*********************main.cpp**************/ #include "test1.h" #include <stdio.h>int main(){ test1_func("hello test1!"); return 0;} /**********************test1原创 2021-10-24 00:00:20 · 1473 阅读 · 0 评论 -
C++的全局,局部静态变量初始化
参考:全局变量,static变量初始化时间通过图片可以得到简单结论;静态局部变量的初始化:调用的时候初始化且只初始化一次。静态全局变量的初始化:于main函数之前初始化。原创 2021-10-17 22:47:56 · 610 阅读 · 0 评论 -
基类存在的意义
在C++这种面向对象的语言中,涉及到框架什么的大型项目的时候,基类很多时候就是一个接口预先定义的抽象模型概念。一.比如说我想把100个UI页面设计为100个状态机的模型,关于每个状态机都需要有的功能为: 1.进入状态机函数start(); 2. 退出状态机函数finish(); 3.状态机的单例函数getInstance();二.如果用面向对象的思路去写,100个状态应该有100个Cpp文件,每个文件代表一个状态,那么问题来了,这100个状态的CPP文件,可能某10个状态我可以把进入函数写...原创 2021-09-25 17:27:08 · 438 阅读 · 0 评论 -
函数定义是子类指针,传入的是父类指针
#include <iostream>#include "stdio.h"class parent {public: virtual void test() { printf("456\r\n"); }};class child : public parent {public: virtual void test() { printf("123\r\n"); }};void func(parent* xx) {.原创 2021-09-15 01:09:58 · 387 阅读 · 0 评论 -
C++空指针初始化
上面的代码会打印“A”。C++ 类指针定义的时候没有初始化的时候,居然可以安全的调用类内部的成员函数而不出错。在网上查了一下:初始化为NULL的类指针可以安全的调用不涉及类成员变量的类成员函数而不出错,但是如果类成员函数中调用了类成员变量则会出错,既然赋值为NULL的情况都可以使用,那么自然不初始化的类指针同样满足这类情况。假设现在有一个简单的类定义如下:class Test{public: void func(){cout << "hahaha" &l...转载 2021-08-03 20:17:17 · 694 阅读 · 0 评论 -
map实现对数组元素的操作
// 用map实现对数组的插入,读写。#include "string.h"#include <map>#include <list>#include "iostream"using namespace std;void test2(){ list<string> parma_list[2] = {{"123", "456", "789", "Start", "N/A", "N/A", "N/A", "N/A", "N/A"}, .原创 2021-07-28 17:49:10 · 507 阅读 · 0 评论 -
map容器实现一对多的映射关系
// 用map存多个变量#include <iostream>#include <string.h>#include <map>#include <vector>using namespace std;typedef map<string, vector<int>> map_vec;// map的key去访问value,而value为容器,从而实现了一个string对应多个int值void test() { .原创 2021-07-27 18:44:13 · 653 阅读 · 0 评论 -
字符串比较的基本使用
// 测试strcmp比较字符串#include <iostream>#include <string.h>int main(int argc, char *argv[]){ // 比较两个完整的字符串 char sdc[12] = "BCM_AA"; int ret = strcmp("BCM", sdc); if (ret == 0) { printf("aaaaaa\n"); } else { .原创 2021-07-27 15:56:43 · 116 阅读 · 0 评论 -
dlopen,dlsym,dlclose的基本使用
代码路径:https://github.com/zion6135/CPP-study/tree/develop/10.Skill/dlopen编译代码生成so ------g++ -fPIC -shared -g test.cpp -o libcaculate.so 编译生g++ -rdynamic -g -o main dlopen.cpp test.h -ldl ./main即可看到如下打印基本思路就是dlopen加载库--------通过dlsym找到函数名,也就是在so中找到这个符原创 2021-06-30 16:12:13 · 255 阅读 · 0 评论