【C++】const详解

C语言——对数组和数组名、二维数组、指针和const的理解和总结 基于Windows10,Visual Studio 2019,x86,对C语言中的数组和数组名、二维数组的理解和总结 阅读详情

常量概念是为了使程序员能够在变和不变之间画一条界限。给C++程序设计项目中提供了安全性和可控性。——《C++编程思想》

在编程中要尽可能多的使用const,这样可以获得编译器的帮助,以便写出健壮性的代码。 

define宏定义,可以将常量赋值给一个变量,但由于在编译过程中只是简单的进行文本替换,并不会对赋值语句进行检查,因此会存在很多潜在的威胁,一旦定义出错,整个调用过程也讲出错。所以C++创始人为了避免这种错误才提出了用const来代替,同时会对所定义的常量进行语法检查。 并且defne是不会给名字分配内存空间的,仅仅是一个常数的别名而已(字面常量存储在常量存储区或立即数形式出现),但是const变量会分配自己的内存空间,具有自己的地址。从这以后可以被用于指针、函数变量、返回类型、类对象和成员函数,用法有所区别,但是概念是一致的。

#define PI 3.1415926 //一般出现在头文件中,不是严格的语句不加“;”

const length = 10;//若不加类型名就默认是int类型,等同于 const int length = 10;

一、const常量

使用形式: const 类型 变量名 = 常量值;

定义常量时需要同时进行初始化!例如:const int a = 10; const int arr[3] = {0,1,2};只有一种情况是不需要初始化的,那就是声明为外部变量。

const定义的变量并不是存储在常量存储区域。const类型的存储跟一般的变量没有区别,在外部定义的存储在全局数据区,static的存储在静态数据区,在函数内部定义的存储在栈,const跟非const存储上没区别。

事实上,const在C和C++中是不同的!

//C
int main()
{
	const int n = 5;
	int arr[n];
	return 0;
}
---------------------------
output:
1>------ 已启动全部重新生成: 项目: Project1, 配置: Debug Win32 ------
1>  main.c
1>e:\cpp\cppprimer\project1\main.c(5): error C2057: 应输入常量表达式
1>e:\cpp\cppprimer\project1\main.c(5): error C2466: 不能分配常量大小为 0 的数组
1>e:\cpp\cppprimer\project1\main.c(5): error C2133: “arr”: 未知的大小
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

在C语言中用常量n去初始化数组arr会发现出现错误。

主要原因是:

1.这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如数字5, 字符串“abc”等。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不 过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。

2.在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它。那么在c语言中我们如果想定义一个事实常量该怎么定义呢?在C语言中我们定义常量的方法可以通过#define宏定义或者enum,这两个是C语言中常用的定义常量的方法。这样上述问题就可以解决了。

用这样的方法在C++中定义是没有问题的。

//C++
int main()
{
	const int n = 5;
	int arr[n];
	return 0;
}
1>------ 已启动全部重新生成: 项目: 测试, 配置: Debug x64 ------
1>  main.cpp
1>e:\cpp\测试\测试\main.cpp(20): warning C4101: “arr”: 未引用的局部变量
1>  测试.vcxproj -> E:\CPP\测试\x64\Debug\测试.exe
1>  测试.vcxproj -> E:\CPP\测试\x64\Debug\测试.pdb (Full PDB)
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

简单地说,C++中可以使用const声明常量,C中在定义数组维数时还是会把const常量认为是不那么“常量”的常量。

虽说const修饰的变量视为不可修改的常量,但是实际上指的是不可直接修改,可以用非常规方法修改数值的。

#include <stdio.h>
int main()
{
	const int  a = 7;
	printf("const int a = %d \n", a);
	int  *p = /*(int*)*/&a;
	*p = 8;
	printf("const int a = %d \n", a);
	return 0;
}
输出: 
const int a = 7
const int a = 7

 对于const变量a,初始化常量a=7,但是通过重新对a地址内的值赋值可以改变a。从监视上看

a已经被修改为8了但是编译器还是认为是一开始初始化的7。这时候可以利用volatile关键字来解决。

另外需要注意:C++的const是升级版!

C++不允许:int  *p = /*(int*)*/&a;这样的方式,c++对类型检查更为严格,int  *p = (int*)&a;就可以了。

----------------------------------------

#include<iostream>
using namespace std;
int main()
{
	int a1 = 3;			//变量
	const int a2 = a1;	//常量 等效于 int const a2 = a1;

	int * a3 = &a1;					//non-const data,non-const pointer
	const int * a4 = &a1;   //const data,non-const pointer
	int * const a5 = &a1;   //non-const data,const pointer
	int const * const a6 = &a1;   //const data,const pointer
	const int * const a7 = &a1;   //const data,const pointer

	// int * a8 = &a2;
	const int * a9 = &a2; 
	// int * const a10 = &a2; 
	int const * const a11 = &a2;  
	const int * const a12 = &a2; 

	return 0;
}

 1、定义常量
(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。

TYPE const ValueName = value;   const TYPE ValueName = value; 

(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.

extern const int ValueName = value;

2、指针使用const

(1)指针本身是常量不可变
     char* const pContent; 

(2)指针所指向的内容是常量不可变
     const char *pContent;  char const *pContent; 

(3)两者都不可变
      const char* const pContent; 

还有其中区别方法,以*为界限,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

二、const修饰函数

使用形式:const 返回值类型 函数(const 参数)

1、const修饰函数参数

A:值传递的const修饰传递,一般这种情况不需要const修饰,因为函数会自动产生临时变量复制实参值。

#include<iostream>
using namespace std;

void Function(const int a)

{
    cout<<a;
    // ++a; //不可修改!
}

int main(void)

{
    Function(8);
    system("pause");
    return 0;
}

这里的const是做了一个约定,变量的初值是不可以被函数改变的,但是由于参数是值传递的,会立即产生变量副本,所以这个对外是隐式的。

B:当const参数为指针时,可以防止指针被意外篡改。

#include<iostream>
using namespace std;

void Function(int *const a)
{
    cout<<*a<<" ";
    *a = 9;
}

int main(void)

{
    int a = 8;
    Function(&a);
    cout<<a; // a is 9
    return 0;
}

C:自定义类型的参数传递,需要临时对象复制参数,对于临时对象的构造,需要调用构造函数,比较浪费时间,因此我们采取const外加引用传递的方法。并且对于一般的int ,double等内置类型,我们不采用引用的传递方式。

#include<iostream>
using namespace std;

class Test

{
public:
    Test(){}
    Test(int _m):_cm(_m){}
    int get_cm() const
    {
       return _cm;
    }
private:
    int _cm;
};

void Function(const Test& _tt)
{
    cout<<_tt.get_cm();
}

int main(void)
{
    Test t(8);
    Function(t);
    return 0;
}
结果输出 8

2、const修饰函数返回值

const修饰返回值分三种情况。

A:const修饰内置类型的返回值,修饰与不修饰返回值作用一样。

#include<iostream>
using namespace std;

const int Function1()
{
    return 1;
}

int Function2()
{
    return 0;
}

int main(void)
{
    int _m = Function1();
    int _n = Function2();
    cout<<_m<<" "<<_n;
    return 0;
}

对于返回值来说,如果是常量,就约定了函数框架里的原变量不会被修改,另外因为是按值返回的,所这个变量会制成副本,初值不会被返回值所修改。这就显得const在这里没有什么作用了。对于内部类型来说,按值返回内部类型时候去掉const会更好。

B:const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。

如果想限制这个对象作为左值使用,就可以使用const。

class X 
{
    int i;
public:
    X(int ii = 0);
    void modify();
};

X::X(int ii) { i = ii; }

void X::modify() { i++; }

X f5() {
  return X();
}

const X f6() {
  return X();
}

void f7(X& x) { // Pass by non-const reference
  x.modify();
}

int main() 
{
  f5() = X(1); // OK -- non-const return value
  f5().modify(); // OK
// Causes compile-time errors:
//!  f7(f5());
//!  f6() = X(1);
//!  f6().modify();
//!  f7(f6());
return 0;
} 

C: const 修饰返回的指针或者引用,是否返回一个指向const的指针,取决于我们想让用户干什么。

如果传递或者返回一个地址(一个指针或引用),那么修改其初值是可能的!但是若返回为const,就会限制这样的事情发生。是否返回一个指向const的指针或者引用,取决于我们想让用户干什么。

// Constant pointer arg/return

void t(int*) {}

void u(const int* cip) 
{
//!  *cip = 2; // Illegal -- modifies value
  int i = *cip; // OK -- copies value
//!  int* ip2 = cip; // Illegal: non-const
}

const char* v() 
{
  // Returns address of static character array:
  return "result of function v()";
}

const int* const w() 
{
  static int i;
  return &i;
}

int main() 
{
  int x = 0;
  int* ip = &x;
  const int* cip = &x;
  t(ip);  // OK
//!  t(cip); // Not OK
  u(ip);  // OK
  u(cip); // Also OK

//!  char* cp = v(); // Not OK
  const char* ccp = v(); // OK
//!  int* ip2 = w(); // Not OK
  const int* const ccip = w(); // OK
  const int* cip2 = w(); // OK
//!  *w() = 1; // Not OK
    return 0;
} 

可以从main中可以看出t()和u()的使用情况。

函数t接非const指针,但是如果传入const指针参数就不能防止函数t修改指针内容,所以编译出错。函数u参数接受const指针,所以接受两种类型的参数。

函数v的返回值只可以被赋值给一个const指针,编译器拒绝w的返回值赋值给一个非const指针,接受const int * const,但是同时它也接受const int*,这不是与返回类型恰好匹配的。因为这个值(包含在指针中的地址)正被拷贝,所以自动保持这样的约定:原始变量不能被改变。因此const int* const中的第二个const当做一个左值使用时(编译器会阻止这样的情况)。

也就是说:函数原型 const int * w() 和 const int * const w()是一样的。由于c++中严格检查类型匹配问题,所以我们要知道,在const修饰的指针变量中,顶层const在有赋值效果的操作中将被忽略。

三、const修饰类

1、const修饰成员变量

const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。

const成员函数能够访问对象的const成员,而其他成员函数不可以,也就是说const成员变量不能在非const成员函数中使用。(const成员函数可以访问成员变量不论是否为const)

#include <iostream>
using namespace std;

class Fred 
{
  const int size;
public:
  Fred(int sz);
  void print();
};

Fred::Fred(int sz) : size(sz) {}
void Fred::print() { cout << size << endl; }

int main() 
{
  Fred a(1), b(2), c(3);
  a.print(), b.print(), c.print();
}

把一个const放在类中,当每个对象需要有自己独有的常量时将会在构造函数中以参数列表的方式初始化常量。

2、const修饰成员函数

const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为const成员函数。注意:const关键字不能与static关键字同时使用,因为static关键字修饰静态成员函数,静态成员函数不含有this指针,即不能实例化,const成员函数必须具体到某一实例。 构造、析构函数不允许使用 const 类型限制符!

#include<iostream>
using namespace std;

class Test
{
public:
    Test(){}
    Test(int _m):_cm(_m){}
    int get_cm() const
    {
        //++_cm;
        _ct++;
       return _cm;
    }
private:
    int _cm;
    mutable int _ct = 0;
};

 
void Cmf(const Test& _tt)
{
    cout<<_tt.get_cm();
}

int main(void)
{
    Test t(8);
    Cmf(t);
    return 0;
}

如果get_cm()去掉const修饰,则Cmf传递的const _tt即使没有改变对象的值,编译器也认为函数会改变对象的值,所以我们尽量按照要求将所有的不需要改变对象内容的函数都作为const成员函数。

但是,如果有个成员函数想修改对象中的某一个成员怎么办?这时我们可以使用mutable关键字修饰这个成员,mutable的意思也是易变的,容易改变的意思,被mutable关键字修饰的成员可以处于不断变化中,如mutable int _ct在 const 成员函数中修改。

3、const 修饰类

const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。

const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。


class AAA
{
public:
	AAA() {};
	~AAA() {};
	void func1() {};
	void func2() const {};
}; 


int main()
{
	const AAA aObj;
	aObj.func1(); ×
    aObj.func2(); 正确

	const AAA* bObj = new AAA();
	bObj->func1(); ×
    bObj->func2(); 正确

	return 0;
}

 

参考源:为什么const对象只能调用const成员函数,而不能调用非const成员函数?


四、const类型转换为非const类型方法

1、const与非const类型赋值问题

  • 非指针类型
const int a = 10;
int b = 20;

b = a; // 正确
a = b; // Error!
---------------
// Error
const int a;
a = 10;

-----------------------------
	int a = 1;
	const int b = 2;

	int c = a;
	const int d = a;

	int e = b;
	const int f = b;

	c = a;
	c = b;
// 	d = a; //Error
// 	d = b; //Error
-----------------------------
  •  指针类型
const int* a  =  new int(10);
int * b = new int(10);

a = b; // 没问题
b = a; // 编译报错 不能从 const int* 转换程 int*

// 下面这种情况不会报错,但可能造成程序崩溃
b = (int*)a;
// ....
*b = 20; // 此处修改了b和a共同指向的地址的内容,程序崩溃

//原因: 
//const int * 表示,指向常量int 类型的指针,即指向的这块内存的内容,不可以修改。(但指针本身可以修改)。
//int * 表示,指向非常量int类型的指针,指针这块内存的内容可修改,指针本身可修改。
//const int* 已经限制此地址内容,不可修改。这时,却让 int * 指针指向这块地址,而使用 int * 指针,表示此地址内容可修改。那么到底可不可以改?
//接上,因此逻辑冲突,编译器报错。

-----------------------------
	int a = 1;
	const int b = 1;

	const int* c = &a;
	int * d = &a;

	const int* e = &b;
	int * f = (int*)&b; 

	c = &a;
	c = &b;
	d = &a;
	//d = &b; //Error
-----------------------------


2、转换方法: 

 用法:const_cast <type_id>  (expression) 

该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

常量指针被转化成非常量指针,并且仍然指向原来的对象;

常量引用被转换成非常量引用,并且仍然指向原来的对象;

常量对象被转换成非常量对象。

通过const_cast运算符,也只能将const type*转换为type*,将const type&转换为type&。

也就是说源类型和目标类型除了const属性不同,其他地方完全相同。

#include<iostream>
using namespace std;
void ConstTest1()
{
	/*volatile*/ const int a = 5;
	int *p;
	p = const_cast<int*>(&a);
	(*p)++;
	cout << a << endl;
	cout << *p << endl;

}

void ConstTest2() 
{
	int i;
	cout << "please input a integer:";
	cin >> i;
	const int a = i;
	int &r = const_cast<int &>(a);
	r++;
	cout << a << endl;
}

int main() 
{
	ConstTest1();
	ConstTest2();
	return 0;
}

输出:
5
6
输入7
输出8

 

 

 

 

 

 

C++ const的用法详解 C++作为一种面向对象的经典语言,它是非常的强大,它的每个部分都值得我们去深入了解。 const的基本概念:      const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。 下面我就const的用法来谈谈: const的用法大致可分为以下几个方面: (1)const修饰 阅读详情

相关推荐

C++ const使用详解

在主函数main()里,标识符gc的值在编译期间是不知道的,这也意味着需要存储空间,但是初始化要在定义点进行,而且一旦初始化,其值就不能改变,我们发现c2是由gc计算出来的,它的作用域与其他类型const的作用域是一样的,这是对#define用法的一种改进。如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。const同样运用于类中,但是它的意义又有所不同,我们可以创建const的数据成员,const的成员函数,甚至是const的对象,但是保持类的对象为const比较复杂,

程序猿老樊的博客 1390

【const-指针-数组】

const - 指针 - 数组

weixin_70338547的博客 1957

【c++】——const详解

文章目录1、在.c中const 的用法2、在.cpp中const 的用法3、Const和static修饰的成员3.1const修改成员变量的处理3.2static修饰的成员变量4、int* const p和const int* p区别 首先,我们要来明确一下,什么是const,在我们通常的观念里面,我们会认为下面这个代码是错误的。 const int b = 20; b = 30; 因为const修饰的变量不能作为左值。初始化完成后值不能被修改。 1、在.c中const 的用法 在我之前的一篇博文中,

qq_43412060的博客 1935

C语言-多维数组,const数组

C语言之数组35.多维数组5.1 声明5.2 初始化二维数组5.3 访问二维数组元素5.4 二维数组元素遍历5.5 二维数组输入5.6 简化5.7 多维数组6. `const`数组6.1 `const`数组是什么?6.2 `const`数组怎么用? 5.多维数组 5.1 声明 语法 类型 数组名[元素个数1][元素个数2]...[元素个数N]; 多维数组最常用形式是二维数组。二维数组相当于...

kuanyew的博客 3543

C++中使用const修饰的数组的初始化方法

总之,在定义const数组时,我们应该根据需求选择最合适的初始化方式,并注意对数组进行越界访问的情况。在C++编程中,我们常常需要定义一些常量数组,比如存储班级学生分数的数组,但这些数组的值不会被改变,因此需要使用const关键字进行修饰。首先,我们需要明确一点,const修饰的数组不能通过赋值操作来进行初始化,因为const修饰的数组是不可修改的,所以必须在定义时进行初始化。需要注意的是,聚合初始化只能用在定义时初始化的数组中,也就是说,我们不能在函数体内使用聚合初始化。

CodeVorter的博客 685

Windows 下使用Visual Studio 2013编译国密算法库GMSSL

Windows 下使用Visual Studio 2013编译国密算法库GMSSL

C++ const 详解

实参中指针指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址肯定跟实参的指针地址不一样,但是这两指针指向的内存是同一块。但是,即使用引用,如果只是作为输入用,最好加上const 修饰,这样就不会改变实参的值,如果刻意修改,编译器会报错。value为成员变量,func函数为 const 成员函数,如果要返回 value 的引用,这里的func函数返回值必须要加上const,改为,上面的操作都是允许的,只不过需要注意的是,*p 是可以修改的,但是*pt 就不能修改。

私房菜 1万+

OTN设备核心知识速记

本文章为工作笔记,若有错误,还需大家指正。不定期更新。

Hiddengold的博客 2648

C++——const详解

指针常量(顶层const): 本质是一个常量的指针,指针指向的地址不能改变,该地址存储的数据可以改变。常量指针(底层const): 指向常量的指针,,a是一个常量,p指向a的地址空间,a的值不能变,p的指向可以改变。更一般的,顶层const可以表示任意的对象是常量,对任何数据类型都适用,比如int、类、指针。 比较特殊的是:指针既可以是顶层const也可以是底层const,和其他类型有明显区别;const修饰变量主要有两个作用: 1、将变量定义为常量,保护被修饰的东西,防止意外的修改,增强程序的健壮性。co

kk阿彬 3万+

Sony DPT RP1/CP1破解攻略

前言 自己有一台Sony DPT CP1和一台kindle,两个都已经用了很多年。直到最近发现微信读书上经常可以找到一些免费而且不错的书,所以就萌生了在两台机器上使用微信读书的想法。kindle比较容易实现,直接打开内置浏览器,进入微信读书网页版就行了,而Sony的电纸书则只能通过破解+安装微信读书的方式实现。大概弄了两三个小时吧,也遇到了一些问题,所以这里记录一下整个过程,希望能方便后来的使用者。 首先感谢HappyZ, osc_t5nbj8ds。前者是提供公开破解的方法的大神,后者则是解决了我遇到的问题

weixin_43467572的博客 1万+

实战演练:基于Veristand Custom Device的硬件在环(HIL)数据流控制模块开发

本文详细介绍了基于Veristand Custom Device的硬件在环(HIL)数据流控制模块开发实战。通过LabVIEW环境配置、动态路由逻辑构建、实时处理核心开发及性能优化等关键步骤,帮助工程师快速掌握定制化HIL测试系统的开发技巧,提升测试效率与准确性。

weixin_29206669的博客 475

C++ const用法详解

本文根据const 目录 前言 一、const的作用 二、const修饰普通类型的变量 三、const修饰指针变量 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、const的作用 二、const修饰普通类型的变量 三、const修饰指针变量 总结 左定值,右定向,const修饰不变.

m0_37806005的博客 8890

Silvaco TCAD 半导体器件仿真全攻略:从入门到精通

本文介绍了Silvaco TCAD半导体器件仿真平台的核心功能与应用方法。主要内容包括: Silvaco TCAD的核心模块组成(ATHENA工艺仿真和ATLAS器件仿真)及其在半导体研发中的重要作用,能够通过数值仿真预测器件电学特性,显著降低研发成本。 环境配置要点,包括内存分配、文件目录管理和许可证验证,为仿真工作提供基础保障。 仿真核心概念:详细讲解了网格划分策略和物理模型选择原则,强调基于物理直觉的自适应加密网格方法。 以PN结二极管为例,提供了完整的仿真代码示例,涵盖从网格定义、掺杂设置到结果分析

huanghm88的专栏 200

C++中const详解

一、对于C++中的const修饰的内部类型(build-in type)变量,除了以下几种情况,编译器是不会为其创建存储空间 a. 取一个const的地址 b. 把一个const作为一个带引用(指针)的参数传递给一个函数 c. 把它定义为extern  而当编译器不为其创建存储空间的时候,const是作为编译时常量来保存在编译器的符号表中(symboltable)的,在编译期间

beckle_ye的专栏 837

YOLOv11改进-卷积-引入Upsampling by Dynamic DySample 解决传统上采样灵活性问题

现有的上采样方法如等,依赖于动态卷积来生成上采样的内容感知核,但这些方法需要额外的子网络生成动态卷积核计算量较大。尤其是 FADE 和 SAPA 需要高分辨率的特征图作为引导,进一步增加了计算负担,并限制了应用场景。DySample的核心思想是将上采样过程重新定义为点采样(Point Sampling)。通过学习输入特征图中的采样点坐标,DySample 生成内容感知的采样点来对特征图进行重新采样,而不是使用动态卷积核。具体实现步骤如下:​​1. 输入特征图:大小为 C×H×W的输入特征图。

qq_64693987的博客 4660

2025国赛数学建模A题 完整Python代码 烟幕干扰弹的投放策略

常量定义G = 9.8 # 重力加速度 m/s²V_SMOKE_SINK = 3 # 烟幕下沉速度 m/sMISSILE_SPEED = 300 # 导弹速度 m/sEFFECTIVE_RADIUS = 10 # 有效遮蔽半径 mEFFECTIVE_DURATION = 20 # 有效遮蔽时间 sTARGET_POS = np.array([0, 200, 0]) # 目标位置FALSE_TARGET_POS = np.array([0, 0, 0]) # 假目标位置# 初始位置。

YOLO 1106

c++的const详解

有时候我们需要一个一个变量,并且这个变量的值不可以改变,c++语言就提供了这么一个关键字,他就是const。 一旦你把一个变量的声明成了const以后,以后任何试图改变const变量的操作都会被编译器认为是错误的,但是const变量一定要在对开始定义的时候初始化,没有初始化的const变量是非法的,用常量初始化或者是变量初始化都可以,只要它可以转换成为const声明的变量类型。

love coding 1564

C# 实现 Modbus 通信全教程(支持 TCP 和 RTU,含完整错误处理)

环境准备:安装 NModbus4 库,明确设备参数(IP/串口、地址、数据类型);连接设备:TCP 用 TcpClient,RTU 用 SerialPort,注意超时和参数匹配;读写数据:根据数据类型调用对应方法(读保持寄存器用 ReadHoldingRegisters);错误处理:捕获连接、超时、协议等异常,针对性排查问题。掌握这些后,即可轻松实现与工业设备的 Modbus 通信,为上位机开发提供稳定的数据交互能力。

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

C++ const 关键字详解

用通俗的语言讲解 c++ 中的 const 关键字

weixin_73162565的博客 2374

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ const的详解

概述 const 是一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器哪些值是保持不变的,如果我们的代码试图去修改,编译器会给出错误提示。const可以使用在很多地方,下面是我对const进行的梳理。 1、const修饰变量 修饰变量时,表示此变量的值是只读的,不能被修改,因为不能被修改所以必须初始化。如: const int abcd = 1234; const int ival; /...

weixin_39640298的博客 1763

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++ Const详解

参考Primer c++

xuyongqi的博客 2111

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 【C++】volatile关键字
下一篇: 【Linux】文件基本属性 chown
HelloZEX
博客等级 码龄11年 486粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值