设为首页 收藏本站 切换语言

const在MT5的用法

| 发表于 2023-2-15 23:18:34 | 显示全部楼层 |复制链接
© 本贴为 xxtz 原创/首发,严禁抄袭!
const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。
1.const修饰基本数据类型
1.1 修饰一般常量及数组  int const arr[2]={1,2} 等价与 const int arr[2]={1,2}
1.2 修饰指针(*)

顶层const 和 底层const,前者(比如int* const p=a,本质是一个常量型的指针,常量指针)可以表示任意对象的常量(指针、引用、int、double都可以),后者(比如const int* p=a,指针所指的对象是常量,指针常量)只有指针和引用等复合类型可以是。
根据const位于星号*的左右侧,有通俗理解:左定值,右定向,const修饰不变量。
当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换才行。一般来说,非常量可以转换成常量,反之则不行。
2.const 修饰函数

const 在函数中根据修饰的位置分为三种:函数参数、函数返回值、成员函数。
const int fun(const int a) const;

2.1 如果输入参数为指针,如
void stringcopy(char* strdest, const char* strsource);

加上const之后就会起保护指针意外修改的作用。实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,但是这两个指针指向的内存是同一块。加上const修饰后,如刻意修改这一内存,编译器会报错。
2.1 如果输入参数为引用(引用是某个实例的别名,程序为指针变量分配内存区域;而不为引用分配内存区域),加上const 之后既起到了保护作用,也提高了程序效率。调用void func(A a)  ,其中A是用户自定义的类型。程序会产生一个临时对象,随后调用拷贝构造函数,当函数结束的时候,进行析构释放资源。如果改成引用void func(A &a); 只是相当于实参的一个别名,不会产生临时变量,所以自定义类型,建议用引用作为函数形参。

2.2 const修饰返回值。 值传递是没有必要用此修饰。返回值是指针,接收的变量也必须是const修饰,如

const char* func(); const char* sr=func();


2.3 const 修饰的成员函数(void func(int x) const;)为了保护成员变量,要求const 函数不能修改成员变量,否则编译会报错。只有成员函数才可以在后面加const,普通函数后加const无意义。
const函数的规则:
   1. const 对象只能访问const 成员函数,非const 的对象可以访问任何成员函数,包括const 成员函数。
    2.如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数。
    3.const成员函数可以访问所有成员变量,但是只能访问const的成员函数。
    4.非const成员函数,可以访问任何成员,包括const成员成员函数。
    5.const成员函数不能修改任何的成员变量,除非变量用mutable修饰。


const全局变量在其他文件中是不可见的,这和添加了static关键字的效果类似。
举报

评论 使用道具

精彩评论2

ken138888
B
| 发表于 2023-2-16 07:16:28 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

lxtx
D
| 发表于 2023-2-16 10:27:51 | 显示全部楼层
发现自己知识面太窄
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)