c++随笔-4

C++:随笔4--对象 类是一个模型,当我们为这个类创建实例的时候也就是对象的本身。 对象的内部可以有变量和函数,而结构通常只是由各种变量构成。对象与结构有很多相似之处,但是对象还可以有他们自己的函数。 类由变量和函数组成,对象将使用哪些变量来存储信息,调用哪些函数来完成操作,所以习惯上类里边变量成为属性,函数成为方法。 OOP(面向对象编程过程): 第一步:创建一个类(每个类跟变量一样都有一个名字,类名的第一个字母通常采用大写) “::”作用域解析符作用是告诉编译器这个方法存在于何处,或者说是属于哪一个类。 std: 阅读详情

define

#include <cxxabi.h> // 包含 __cxa_demangle 函数,将类型转换成编码人员可阅读的类型

void DefineFunc() {
    // 1. 定义常量,预处理阶段会用最后边的内容替换宏定义的名称
#define MY_PI 3.1415926  // # 此处宏定义常量 3.1415926 的名称为 MY_PI
    std::cout.precision(7);    // 设置小数点后打印精度
    std::cout.setf( std::ios::fixed, std::ios::floatfield );
    std::cout << "MY_PI value: " << MY_PI << std::endl;
    printf("MY_PI value: %.7f\n", MY_PI);
    std::cout.unsetf(std::ios::floatfield);
    // 2. 宏定义函数
#define ADD(a, b) a + b
    int a = 10;
    int b = 12;
    std::cout << "ADD value: " << ADD(a, b) << std::endl;
    // 以上这个宏定义函数有点问题,因为宏定义只是进行文本替换,不做类型检查
    std::cout << "ADD value: " << a * ADD(a, b) * a << std::endl;
    // 预处理后 a * a + b * a,没有期望中的 a * (a + b) * a
#define ADD2(a, b) (a + b)  // 加括号解决上述问题,所以写宏定义函数时,推荐每层都加括号确定优先级
    std::cout << "ADD2 value: " << a * ADD2(a, b) * a << std::endl;

    // 3. define 中的特殊操作符有#、##、…、__VA_ARGS__
#define A(x) #x   // 将x转换为字符串
    std::cout << "A(3.1415926) value: " << A(3.1415926) << std::endl;
    std::cout << abi::__cxa_demangle(typeid(decltype(A(3.1415926))).name(), 0, 0, 0) << std::endl;
    std::cout.setf(std::ios::boolalpha);
    std::cout << (typeid(decltype(A(3.1415926))).name() == typeid (char [10]).name()) << std::endl;
    std::cout.unsetf(std::ios::boolalpha);
#define B(n) x##n      // 拼接字符串
    int B(1) = 1;  // int x1 = 1;
    // 可变参数 ... 和 __VA_ARGS__
#define C(format, ...) (printf(format, __VA_ARGS__))   // 不允许省略可变参数
#define D(format, ...) (printf(format, ##__VA_ARGS__)) // 允许省略可变参数
#define E(format, arg...) (printf(format, arg))        // 不允许省略可变参数
#define F(format, arg...) (printf(format, ##arg))      // 允许省略可变参数
    C("-> %s, %d, %s\n", "sss", 23, "sss");
    D("-> %s, %d, %s\n");   // 此处省略可变参数
    E("-> %s, %d, %s\n", "sss", 23, "sss");
    F("-> %s, %d, %s\n", "sss", 23, "sss");

    // 4. 多行定义
#define DELETE_PTR(ptr) do { \
    if (ptr != nullptr) { \
    delete [] ptr; \
    ptr = nullptr; \
    } \
    } while (0);  // 释放指针数组
    int *p = new int[2];
    DELETE_PTR(p);
    std::cout.setf(std::ios::boolalpha);
    std::cout << "p == nullptr: " << (p == nullptr) << std::endl;
    std::cout.unsetf(std::ios::boolalpha);

    // 5. 条件编译,此处和当前文件有冲突,为编译通过才将此注释
    // #define _Win32    // 根据不同平台添加对应头文件,
    // #include <windows.h>
    // #else   // 可省略
    // #include <sys/epoll.h>
    // #endif

    // 6. 解决不同源文件中对同一个头文件多次重复包含,此处和当前文件有冲突,为编译通过才将此注释
    // #ifndef TEST_DEMO_H_   // 不同文件一般此定义不同,也必须不能相同
    // #define TEST_DEMO_H_
    // #include <iostream>
    // #endif
    // 7. 宏取消
#define G 10000
    std::cout << G << std::endl;
#undef G
    // std::cout << "G value: " << G << std::endl;  // 此处编译报错,因为G已经取消
}

输出结果:
MY_PI value: 3.1415926
MY_PI value: 3.1415926
ADD value: 22
ADD value: 220
ADD2 value: 2200
A(3.1415926) value: 3.1415926
char [10]
true
-> sss, 23, sss
-> (null), -891725504,
-> sss, 23, sss
-> sss, 23, sss
p == nullptr: true
G value: 10000

  • 宏定义形参是标识符,宏调用中实参可以是表达式
  • 带参数的宏定义中,书写时宏定义名称和形参之间不能出现空格
  • 若宏定义存在形参,实际上是不分配内存单元,所以不需要给形参写明类型

typedef

void TypedefFunc() {
    typedef int INT;   // 定义 int 的别名
    INT a = 10;
    typedef char * CHAR_PTR;  // 定义 char * 的别名
    CHAR_PTR b,c;  // 此处 char *b,char *c
    std::cout.setf(std::ios::boolalpha);
    std::cout << "typeid (char *) == typeid (b) : " << (typeid (char *) == typeid (b)) << std::endl;
    std::cout << "typeid (char *) == typeid (c) : " << (typeid (char *) == typeid (c)) << std::endl;
    std::cout.unsetf(std::ios::boolalpha);
#define CHAR_PTR2 char *
    CHAR_PTR2 d, e;  // 此处 char *d,char e,注意 define 和 typedef 这种方式定义使用的区别
    std::cout.setf(std::ios::boolalpha);
    std::cout << "typeid (char *) == typeid (d) : " << (typeid (char *) == typeid (d)) << std::endl;
    std::cout << "typeid (char *) == typeid (e) : " << (typeid (char *) == typeid (e)) << std::endl;
    std::cout << "typeid (char) == typeid (e) : " << (typeid (char) == typeid (e)) << std::endl;
    std::cout.unsetf(std::ios::boolalpha);

    typedef char ARRAY[2];  // 定义数组类型 char [2],注意数组也是一种类型
    ARRAY arr;
    std::cout.setf(std::ios::boolalpha);
    std::cout << "typeid (char [2]) == typeid (arr) : " << (typeid (char [2]) == typeid (arr)) << std::endl;
    std::cout.unsetf(std::ios::boolalpha);

    typedef void (*FUNC)(int);  // 定义一个形参,没有返回值的函数指针(回调函数多定义函数指针形式)
    FUNC func;
    // func = Demo;   // 例如存在一个函数,void Demo(int len){},就可使用 func = Demo,函数的名字是函数入口地址

    typedef struct Stu {   // 定义结构体别名
        int id;
    }STU;
    STU t;
    // 从c++11开始提供 using 关键字,功能更强大,可做的事情更多,其中就可代替 typedef
    using FLOAT = float;  // 定义 float 别名
    FLOAT f;
}

输出结果:
typeid (char *) == typeid (b) : true
typeid (char *) == typeid © : true
typeid (char *) == typeid (d) : true
typeid (char *) == typeid (e) : false
typeid (char) == typeid (e) : true
typeid (char [2]) == typeid (arr) : true

  • typedef 多用于定义别名,通俗来说就是给已有类型在起个新名字
  • c++11开始提供了功能更多的 using 关键字可代替 typedef

const

void ConstFunc() {
    // 1. const 修饰变量,位置置于变量之前即可,修饰后相当于常量,值不可被修改
    const int a = 10;  // a 和 b 写法没有区别
    int const b = 10;
    decltype (a) c = 20;  // 推导出 c 类型 const int
    // a = 30;  // 不允许修改
    // b = 30;
    // c = 30;
#define VAL 123
    const int d = 123; // 定义常量,代替宏定义写法,提高效率
    // const 修饰类对象时,此对象只能调用有 const 修饰的类成员函数
    // const 修饰类型成员变量时,只能使用初始化列表进行初始换,也可以在定义的时候直接用常量或枚举初始化
    /* class A {
     * public:
     * A() : a(1){}   // 在构造函数中使用初始化列表进行赋值初始化
     *
     * private:
     * const int a = 1;  // 直接初始化
     * };
    */

    // 2. const 修饰指针,判断时去掉类型,看 const 修饰的是指针还是指针指向的地址
    int x = 10;
    int y = 20;
    const int *e = &x;   // const 修饰指针指向的地址,即指针指向的地址可变,不能通过指针间接修改(常量指针)
    // *e = 20;    // error,不能通过指针改变此变量的值
    e = &y;        // 指针可以重新指向一个地址
    int const *f = &x;   // 这种写法和上边效果一样
    // *f = 20;    // error
    e = &y;        // ok
    int* const g = &x;   // const 修饰指针,指针一旦指定不可改变指向内容,可通过指针间接修改值
    // g = &y;     // error,指针指向的地址不可被修改
    *g = 20;       // ok,可以通过指针间接修改修改值
    const int* const h = &x;   // 第一个 const 修饰指针指向的地址,第二个 const 修饰指针
    // h = &y;     // error,指针指向的地址不可被修改
    // *h = 20;    // error,不能通过指针间接修改修改值

    // 3. const 修饰函数,写在函数后边,如 int Add(int a, int b) const{}
    // 修饰类成员函数时,其实修饰的是 this 指针,不能通过指针修改类的成员变量值

    // 4. 修饰函数形参时,初始化后表示函数中此参数不可修改,只能读取,一般提高性能写法如下 int Add(const std::string &a);
    // 不推荐修饰函数返回值,const int Add() {return 3;},编译器会提示警告信息

    // 若想修改 const 值,c语言中通过指针间接可修改,c++中可通过强制去除 const
    // 定义时使用 mutable 修饰(使用与类成员变量)
    // mutable int ss = 3; void Add() const { ss++;}    // OK
}
const int Add3() { return 3;}

int Add(int a, int b) const { return a + b; }
  • 使用 const 修饰的变量可看做常量,值不可被修改

c++引用

void ReferenceFunc() {
    int a = 10;
    int &ra = a;   // 引用基本语法,定义时必须初始化,引用内存的别名

    std::cout << std::dec << "a value : " << a << std::endl;
    std::cout << std::hex << "a address : 0x" << &a << std::endl;
    std::cout << std::dec << "ra value : " << ra << std::endl;
    std::cout << std::hex << "ra address : 0x" << &ra << std::endl;
    ra = 20;   //  通过引用修改变量值,指针需要解引用 *p = 20;
    std::cout << std::dec << "a value : " << a << std::endl;
    std::cout << std::hex << "ra address : 0x" << &ra << std::endl;
    // 引用地址上层无法看到,在编译时底层使用 const int * 实现(常量指针)
    // 引用使用在函数形参中,void Swap(int &a, int &b)
    int c = 10;
    int d = 20;
    std::cout << std::dec << "c value : " << c << std::endl;
    std::cout << std::dec << "d value : " << d << std::endl;
    Swap(c, d);
    std::cout << std::dec << "c swap value : " << c << std::endl;
    std::cout << std::dec << "d swap value : " << d << std::endl;

    // 可以定义指针的引用,不能定义引用的引用
    int *p = &c;
    int* &rp = p;
    // int && ra2 = ra;
}

void Swap(int &a, int &b) {     // 两值互换,参数以引用方式传递
    a = a + b;
    b = a - b;
    a = a - b;
}

输出结果:
a value : 10
a address : 0x0x65fd7c
ra value : 10
ra address : 0x0x65fd7c
a value : 20
ra address : 0x0x65fd7c
c value : 10
d value : 20
c swap value : 20
d swap value : 10

  • c语言有指针,c++兼容c语言的同时,添加了OOP、GP等特性,引用也是c++特性
  • 注意引用和指针使用的的区别

函数

void FunctionFunc() {
    // 函数语法
    // void        Func      (int a)         {}
    // 函数返回值   函数名称   [函数形式参数]   函数实现,其中形式参数可有可无,形参变量名称不使用也可不写

    // 函数形式参数不是引用或指针时,实际调用时一般都是对实际传入的参数拷贝一份在函数中使用,不会影响到实际变量
    // 函数形式参数是引用或指针时,实际调用时实际传入的是实际参数的地址,所以函数中对此地址的操作会影响到实际变量
    int a = 10;
    int b = 20;
    std::cout << std::dec << "a value : " << a << std::endl;
    std::cout << std::dec << "b value : " << b << std::endl;
    std::cout << "Swap1(int a, int b) : " << std::endl;
    Swap1(a, b);      // 按值传递
    std::cout << std::dec << "Swap1 a value : " << a << std::endl;
    std::cout << std::dec << "Swap1 b value : " << b << std::endl;
    std::cout << "Swap2(int &a, int &b) : " << std::endl;
    Swap2(a, b);      // 按指针传递
    std::cout << std::dec << "Swap2 a value : " << a << std::endl;
    std::cout << std::dec << "Swap2 b value : " << b << std::endl;
    std::cout << "Swap3(int *a, int *b) : " << std::endl;
    Swap3(&a, &b);    // 按指针传递
    std::cout << std::dec << "Swap3 a value : " << a << std::endl;
    std::cout << std::dec << "Swap3 b value : " << b << std::endl;
    std::cout.setf(std::ios::hex);
    std::cout << std::dec << "Swap3 address : 0x" << &CDay1::Swap2 << std::endl;
    std::cout.unsetf(std::ios::hex);

    // 一维数组做函数形参
    auto Print1 = [](int *arr, int len) {    // 指针做形式参数
        std::cout << abi::__cxa_demangle(typeid(arr).name(), 0, 0, 0) << std::endl;
        for (int i = 0; i < len; ++i) {
            std::cout << "arr[" << i << "] = " << arr[i] << "\t";
        }
        std::cout << std::endl;
        arr[0] = 10;  // 此处值改变会影响函数外边的数组中对应的元素值
    };
    auto Print2 = [](int arr[], int len) {    // int [] 做形式参数,退化为指针
        std::cout << abi::__cxa_demangle(typeid(arr).name(), 0, 0, 0) << std::endl;
        for (int i = 0; i < len; ++i) {
            std::cout << "arr[" << i << "] = " << arr[i] << "\t";
        }
        std::cout << std::endl;
        arr[0] = 20;  // 此处值改变会影响函数外边的数组中对应的元素值
    };
    auto Print3 = [](int arr[4], int len) {    // int [4] 做形式参数,退化为指针
        std::cout << abi::__cxa_demangle(typeid(arr).name(), 0, 0, 0) << std::endl;
        for (int i = 0; i < len; ++i) {
            std::cout << "arr[" << i << "] = " << arr[i] << "\t";
        }
        std::cout << std::endl;
        arr[0] = 30;  // 此处值改变会影响函数外边的数组中对应的元素值
    };

    int arr[4] = {1, 2, 3, 4};
    std::cout << "Print1\t";
    Print1(arr, 4);
    std::cout << "Print3\t";
    Print2(arr, 4);
    std::cout << "Print2\t";
    Print3(arr, 4);
    Print1(arr, 4);

    // 使用 typedef 声明函数指针
    // typedef void        (*FuncPtr)(int, int);
    // 关键字   函数返回值   函数指针名称  函数形式参数
    // FuncPtr = Swap2;   调用 FuncPtr(a, b);
    // 回调函数(被作为参数传递的函数)
    // void Demo(FuncPtr func, int a, int b) { func(a, b); }

    // 二维数组做函数参数
    // 数组指针 int (*p)[],指针指向 int[]
    // 指针数组 int *p[],是个数组,元素类型为int*
    // 函数指针 int (*fun)(int x,int y);  指向函数的指针
    // 指针函数 int* fun(int x,int y);    返回值为 int* 的函数
    auto Sum = [](int arr[][4], int row) -> int {   // 注意列数不能省略
        std::cout << abi::__cxa_demangle(typeid(arr).name(), 0, 0, 0) << std::endl;
        int ret = 0;
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < 4; ++j) {
                std::cout << std::dec <<"arr[" <<i << "][" << j << "] = " << arr[i][j] << "\t";
                ret += arr[i][j];
            }
            std::cout << std::endl;
        }
        return ret;
    };

    int arr2[][4] = {
        {1, 2},
        {3, 4},
        {5, 6},
        {7, 8}
    };        
    int ret = Sum(arr2, 4);
    std::cout << "Sum arr2 value: " << ret << std::endl;
}

void Swap1(int a, int b) {
    a = a + b;
    b = a - b;
    a = a - b;
}
void Swap2(int &a, int &b) {
    a = a + b;
    b = a - b;
    a = a - b;
}
void Swap3(int *a, int *b) {
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}

输出结果:
a value : 10
b value : 20
Swap1(int a, int b) :
Swap1 a value : 10
Swap1 b value : 20
Swap2(int &a, int &b) :
Swap2 a value : 20
Swap2 b value : 10
Swap3(int *a, int *b) :
Swap3 a value : 10
Swap3 b value : 20
Swap3 address : 0x1
Print1 int*
arr[0] = 1 arr[1] = 2 arr[2] = 3 arr[3] = 4
Print3 int*
arr[0] = 10 arr[1] = 2 arr[2] = 3 arr[3] = 4
Print2 int*
arr[0] = 20 arr[1] = 2 arr[2] = 3 arr[3] = 4
int*
arr[0] = 30 arr[1] = 2 arr[2] = 3 arr[3] = 4
int (*) [4]
arr[0][0] = 1 arr[0][1] = 2 arr[0][2] = 0 arr[0][3] = 0
arr[1][0] = 3 arr[1][1] = 4 arr[1][2] = 0 arr[1][3] = 0
arr[2][0] = 5 arr[2][1] = 6 arr[2][2] = 0 arr[2][3] = 0
arr[3][0] = 7 arr[3][1] = 8 arr[3][2] = 0 arr[3][3] = 0
Sum arr2 value: 36

  • 函数简单理解就是将某些功能代码模块化,这样可直接调用,而不必每次都写相同的步骤,减少代码冗余
  • c++11 新增了 lambda 表达式,能更直观的体现函数式编程思想
  • c++中,数组、函数等都可当做类型用来定义变量

在PLC中将十六进制数据转换为浮点数(通常遵循IEEE 754标准)需要理解数据存储格式,并按以下步骤操作: 通过以上步骤,您可以在PLC中实现十六进制到浮点数的转换。T DBD20 // 将数据传送到浮点数变量(如DB1.DBD20)指数位(8位):实际指数 = 存储值 - 127(偏移量)。:必须确认PLC的存储顺序(大端或小端),否则结果错误。将两个16位寄存器合并为32位数据,需注意。尾数位(23位):隐含前导1,实际值为。:确保32位数据在寄存器中连续且对齐。符号位(1位):0表示正,1表示负。:高位寄存器在前(如西门子PLC)。:低位寄存器在前(如三菱FX系列)。,误差因截断导致)。 阅读详情

相关推荐

vue3+SuperMap iClient3D for Cesium实现可视域分析功能

基于Vue3框架及SuperMap iClient3D for Cesium提供的ViewShed3D类实现场景动态可视域分析

qq_43334519的博客 2248

cmdline轻量级的C++命令行解析库--windows

cmdline介绍 cmdline 是一个非常easy好用的C++命令行解析库,其基于模板。所以使用非常easy,写出的代码也非常优雅。 因为其仅仅包括一个头文件。所以非常easy集成到自己的项目中。 官网:https://github.com/tanakh/cmdline 参考:http://www.mamicode.com/info-detail-1923374.html 在window上利用VS编译的时候遇到问题汇总。 错误1cxxabi.h提示错误 fatal error C1083.

缘如风的博客 3760

Ego-Planner实战避坑指南:从环境搭建到仿真运行

本文详细介绍了在Windows系统下,通过WSL2搭建Ego-Planner无人机路径规划算法开发环境的完整流程与实战避坑指南。内容涵盖ROS Noetic安装、第三方依赖库(如Ceres Solver)编译冲突解决、Realsense SDK版本降级处理,以及Gazebo仿真与真机调试的常见问题,旨在帮助开发者高效完成环境配置并成功运行仿真。

weixin_29232507的博客 699

【C/C++基础进阶系列】实战记录 -- 跨平台基础组件 (命令行解析,日志,配置文件,网络请求)

【C/C++基础进阶系列】跨平台基础组件 -- 命令行解析,日志,配置文件读写 【1】命令行解析 【1.1】cmdline 跨平台改进 -- 支持 win32 与 linux 错误 1,fatal error C1083: 无法打开包括文件:“cxxabi.h”: No such file or directory 原文件中 #include <cxxabi.h> 修改 将该头文件引入删除,改为 #include "abi.h" abi.h 头文件如下 #ifndef ABI_

CopperSun 技术博客 1241

C#上位机部署YOLO模型:ONNX转换+推理加速+内存优化全攻略

本文针对C#上位机部署YOLO模型的三大痛点,提供从模型转换到优化部署的完整解决方案。首先介绍将YOLO模型转换为ONNX格式的必要性和方法,包括自动和手动两种转换方案及常见问题解决。然后详细讲解C#环境配置和基础部署流程,包括图像预处理、模型加载、推理计算和结果解析。最后提出推理加速和内存优化策略,通过硬件适配、多线程处理和资源复用等技术手段,实现工业场景下的高效稳定运行。全文提供可直接复用的代码片段和实测验证方案,覆盖YOLOv5/v7/v8全版本,帮助开发者快速实现轻量化部署。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 785

SSE(Server-Sent Events)完整使用示例

本篇使用Node.js 作为服务端,在浏览器客户端演示SSE的完整实例和演示。实现了一个基于 Server-Sent Events (SSE) 的实时数据推送功能。

oscar999的专栏 750

C++查看完整变量类型

C++查看完整变量类型 使用 cout<<typeid(int).name()<<endl; #include<typeinfo> #include<iostream> using namespace std; int main(){ char search; scanf("%c",&search); cout<<typeid(search).name()<<endl; } 输出结果如下: 56 c ----------

编程小喵 1507

某AI推荐系统项目管理复盘:架构师总结的6大方法论与调优策略

我是张三,某大厂资深AI架构师,主导过5个千万级用户的推荐系统项目(覆盖电商、内容、视频、音乐、外卖等场景)。我的公众号“AI架构师笔记”会分享更多AI项目管理和技术实战经验,欢迎关注。最后的话:推荐系统不是“一锤子买卖”,而是“持续优化的过程”。希望这篇文章能帮你少踩坑,多做对——毕竟,把复杂的事做成,才是架构师的核心能力。

2501_92132293的博客 362

c++:改造cmdline用于MSVC下的命令行参数解析

cmdline是一个轻量级的c++命令行参数解析工具,全部源码只有一个cmdline.h头文件,使用起来非常方便,关于如何使用它,不是本文讨论的重点,本文要说的是如何解决cmdline在MSVC下不能编译的问题。你打开下面的cmdline项目托管地址只看首页上的说明就会使用了,另外,如果你看英文比较吃力,这篇博文有全面详细的中文翻译《cmdline —— 轻量级的C++命令行...

weixin_34159110的博客 1156

高压控制单元与接触器 —— BMS电池的“高压大门”

高压接触器在BMS电池管理系统中扮演着“高压大门”的角色,负责控制电池包与整车高压母线的连接与隔离。接触器的工作原理基于线圈产生的磁力吸合接点,通过主触点接通高压电流路径,辅助触点检测状态,灭弧结构保护接点。预充电路的设计是为了避免直接连接大电容时产生的浪涌电流冲击,通过预充电阻逐步充电,确保系统安全上电。接触器控制策略包括顺序控制、辅助触点检测、温度监控、故障断电和背靠背MOS辅助控制,以确保系统的高效和安全运行。工程师在选择接触器型号、控制线圈、检测状态、软件冗余控制和预充失败保护等方面提供了具体建议。

weixin_43199439的博客 813

GEE:基于MODIS数据计算NDVI时间序列,并使用Savatsky-Golay(SG)滤波器对其进行平滑处理

优快云@_养乐多_本文将介绍如何在 Google Earth Engine (GEE) 平台中,使用 MODIS 数据计算 NDVI 时间序列,并对该数据集应用 Savitzky-Golay 滤波器,得到了一个新的平滑后的数据集。Savitzky-Golay 滤波器可以有效地去除信号中的噪声,并平滑信号的变化。该方法可以扩展到基于 MODIS 数据计算的任何指数或者波段。

养乐多的博客 1426

Effective C++随笔 1 to 4 让自己习惯C++

让自己习惯C++ 1.视C++为一个语言联邦 2.尽量以 const enum inline 代替 #define 即以编译器处理替代预处理 建议:(1)对于单纯常量,尽量用 const 与 enum 代替 (2)对于形似函数的宏,使用 inline 内联函数代替 3.尽可能使用 const const适用范围: (1)在class外部修饰global与namespace作用域中的常量。 (2)在...

lxx909546478的博客 240

SAP Group Reporting入门指南(3)--公司间匹配对账ICMR及合并版本等主数据

S/4HANA CLOUD公司间匹配和对账

bflyfish的博客 965

C++学习随笔(4)——类和对象的初探

类和对象的初步介绍,介绍类这一概念

2301_77272486的博客 1126

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

4.25c++prime随笔

3.6#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { string s("some string"); for(auto &amp;c:s) c = 'x'; cout&lt;&lt;s&lt;&lt;endl; return ...

weixin_40526619的博客 150

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++随笔4——类的封装及控制访问

C++随笔

qq_43159510的博客 405

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

More Effective C++ 随笔 1 to 4 基础议题

1.仔细区别pointers与reference (1)当一个指向有可能出现为NULL指向空时,那么应该使用pointers。 reference必须要指向一个对象而决不能为NULL,也因此,reference必须要有初始值。 同时也正因为reference不含NULL的情况,因此reference会比pointers更富效率(使用前不需要测试其有效性)。 (2)当需要可变的指向,也即可能会在不同...

lxx909546478的博客 211

C++ primer plus 1-4章 随笔

char str; sizeof (str)整个字符长度;strlen(str) 可见的字符不包括空字符, 头文件 cstring(string.h)。 面向行的输入: (1) cin.getline(str,20);通过换行符确定行尾不保存换行符,用空 字符保存换行符。 (2) cin.get(str , 20);不保存换行符;cin.get()读取下一个字符str

RicardoSuzaku的博客 448

C++随笔:.NET CoreCLR之GC探索(4)

  今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔。下面我们继续: // Initialize free object methodtable. The GC uses a special array-like methodtable as placeholder // f...

weixin_33704591的博客 121

C++ Primer 随笔 Chapter 4 数组和指针

1.数组:数组是由类型名、标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称。例如:   int arr[10]; 其中 int 是类型名,arr是标识符而 10 是数组的维数。 2.数组的定义和初始化:数组的初始化要注意以下几点   (1). 数组中存放的元素类型不能是引用类型,除此之外可以是其他任何类型。   (2)...

weixin_30786657的博客 141

C++ primer 随笔(4) (面向对象编程)

protect成员 1.像private成员一样,protected成员不能被类的用户访问。 2.像public成员一样,protected成员可以被该类的派生类访问。 3.派生类只能通过派生类对象访问其基类的protected成员,而不能直接通过基类访问其派生类。 友元关系 声明 class A{ friend class B; public: private: protected: ...

lxx909546478的博客 208

c++计算eigen随笔(4)-y=xb+e

#include <iostream> #include <Eigen/Dense> #include <ctime> using namespace Eigen; using namespace std; int main() { VectorXd e = VectorXd::Random(2)*3; cout << " e:" &lt...

The research on computer technolog 405

C++随笔第一期

学习笔记

qiexinyueaifei的博客 580

PYNQ入门:AXI_GPIO寄存器操作与软硬件协同实战

在嵌入式开发中,ARM处理器与FPGA的软硬件协同设计一直是高性能系统的关键。AXI总线作为两者之间的核心数据通道,负责将处理器的内存访问请求转发至可编程逻辑,而AXI_GPIO则是这一机制下最基础、最典型的外设接口。通过理解AXI_GPIO的寄存器映射和地址分配,开发者无需编写RTL代码,即可实现对物理引脚的控制,这极大降低了FPGA的入门门槛。从Python封装对象到底层MMIO读写,从点灯实验到按键检测,这种基于寄存器的操作方式适用于LED控制、开关读取等低速外设场景,也为后续掌握SPI、I2C等复杂

weixin_34326429的博客 315

随笔2018.4.7(含C++staic静态成员有关内容)

C++:        早上起来,先看了会儿静态成员的有关内容,尽管昨天看了一下基础知识,但在今天实际动手操作时发现还是有许多小知识点没有真正领会。下面总结一下今天比较模糊的几个地方。1、静态数据成员的声明与初始化:    声明格式:例如 static int x;要注意的是静态数据成员的初始化操作必须在类外进行,(格式为int 类名::变量名=?)。2、静态函数:    即在普通的成员函数前加s...

又菜又爱玩 254
上一篇: c++随笔-3
下一篇: c++随笔-5
无夜_
博客等级 码龄7年 2916粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值