当前位置: 首页 > news >正文

wordpress装多站点美食网站设计网站

wordpress装多站点,美食网站设计网站,合肥建设工程竣工结算备案网站,微信名字制作软件小程序const的思考 1、什么是const?常类型是指使用类型修饰符const说明的类型#xff0c;常类型的变量或对象的值是不能被更新的。#xff08;当然#xff0c;我们可以偷梁换柱进行更新#xff1a;#xff09;2、为什么引入const#xff1f;const 推出的初始目的#xff0c;正… const的思考 1、什么是const?    常类型是指使用类型修饰符const说明的类型常类型的变量或对象的值是不能被更新的。当然我们可以偷梁换柱进行更新   2、为什么引入const   const 推出的初始目的正是为了取代预编译指令消除它的缺点同时继承它的优点。   3、cons有什么主要的作用    1可以定义const常量具有不可变性。    例如    const int Max100;    int Array[Max];    2便于进行类型检查使编译器对处理内容有更多了解消除了一些隐患。   例如    void f(const int i) { .........}    编译器就会知道i是一个常量不允许修改    3可以避免意义模糊的数字出现同样可以很方便地进行参数的调整和修改。    同宏定义一样可以做到不变则已一变都变如1中如果想修改Max的内容只需要const int Maxyou want;即可    4可以保护被修饰的东西防止意外的修改增强程序的健壮性。    还是上面的例子如果在函数体内修改了i编译器就会报错    例如    void f(const int i) { i10;//error! }    (5) 为函数重载提供了一个参考。    class A    {    ......    void f(int i) {......} file://一个函数    void f(int i) const {......} file://上一个函数的重载    ......    };    (6) 可以节省空间避免不必要的内存分配。    例如    #define PI 3.14159 file://常量宏    const doulbe Pi3.14159; file://此时并未将Pi放入ROM中    ......    double iPi; file://此时为Pi分配内存以后不再分配    double IPI; file://编译期间进行宏替换分配内存    double jPi; file://没有内存分配    double JPI; file://再进行宏替换又一次分配内存    const定义常量从汇编的角度来看只是给出了对应的内存地址而不是象#define一样给出的是立即数所以const定义的常量在程序运行过程中只有一份拷贝而#define定义的常量在内存中有若干个拷贝。    7 提高了效率。    编译器通常不为普通const常量分配存储空间而是将它们保存在符号表中这使得它成为一个编译期间的常量没有了存储与读内存的操作使得它的效率也很高。   3、如何使用const    1修饰一般常量    一般常量是指简单类型的常量。这种常量在定义时修饰符const可以用在类型说明符前也可以用在类型说明符后。    例如    int const x2;或const int x2;    2修饰常数组    定义或说明一个常数组可采用如下格式    int const a[5]{1, 2, 3, 4, 5};    const int a[5]{1, 2, 3, 4, 5};    3修饰常对象    常对象是指对象常量定义格式如下    class A;    const A a;    A const a;    定义常对象时同样要进行初始化并且该对象不能再被更新修饰符const可以放在类名后面也可以放在类名前面。    4修饰常指针    const int *A; file://const修饰指向的对象A可变A指向的对象不可变    int const *A; file://const修饰指向的对象A可变A指向的对象不可变    int *const A; file://const修饰指针A A不可变A指向的对象可变    const int *const A; file://指针A和A指向的对象都不可变    5修饰常引用    使用const修饰符也可以说明引用被说明的引用为常引用该引用所引用的对象不能被更新。其定义格式如下    const double v;   6修饰函数的常参数    const修饰符也可以修饰函数的传递参数格式如下    void Fun(const int Var);    告诉编译器Var在函数体中的无法改变从而防止了使用者的一些无意的或错误的修改。    7修饰函数的返回值    const修饰符也可以修饰函数的返回值是返回值不可被改变格式如下    const int Fun1();    const MyClass Fun2();    8修饰类的成员函数    const修饰符也可以修饰类的成员函数格式如下    class ClassName    {    public:    int Fun() const;    .....    }    这样在调用函数Fun时就不能修改类里面的数据    9在另一连接文件中引用const常量    extern const int i; file://正确的引用    extern const int j10; file://错误常量不可以被再次赋值    另外还要注意常量必须初始化    例如    const int i5;   4、几点值得讨论的地方    1const究竟意味着什么    说了这么多你认为const意味着什么一种修饰符接口抽象一种新类型    也许都是在Stroustup最初引入这个关键字时只是为对象放入ROM做出了一种可能对于const对象C既允许对其进行静态初始化也允许对他进行动态初始化。理想的const对象应该在其构造函数完成之前都是可写的在析够函数执行开始后也都是可写的换句话说const对象具有从构造函数完成到析够函数执行之前的不变性如果违反了这条规则结果都是未定义的虽然我们把const放入ROM中但这并不能够保证const的任何形式的堕落我们后面会给出具体的办法。无论const对象被放入ROM中还是通过存储保护机制加以保护都只能保证对于用户而言这个对象没有改变。换句话说废料收集器我们以后会详细讨论这就一笔带过或数据库系统对一个const的修改怎没有任何问题。    2位元const V.S. 抽象const?    对于关键字const的解释有好几种方式最常见的就是位元const 和 抽象const。下面我们看一个例子    class A    {    public:    ......    A f(const A a);    ......    };    如果采用抽象const进行解释那就是f函数不会去改变所引用对象的抽象值如果采用位元const进行解释那就成了f函数不会去改变所引用对象的任何位元。    我们可以看到位元解释正是c对const问题的定义const成员函数不被允许修改它所在对象的任何一个数据成员。    为什么这样呢因为使用位元const有2个好处    最大的好处是可以很容易地检测到违反位元const规定的事件编译器只用去寻找有没有对数据成员的赋值就可以了。另外如果我们采用了位元const那么对于一些比较简单的const对象我们就可以把它安全的放入ROM中对于一些程序而言这无疑是一个很重要的优化方式。关于优化处理我们到时候专门进行讨论    当然位元const也有缺点要不然抽象const也就没有产生的必要了。    首先位元const的抽象性比抽象const的级别更低实际上大家都知道一个库接口的抽象性级别越低使用这个库就越困难。    其次使用位元const的库接口会暴露库的一些实现细节而这往往会带来一些负面效应。所以在库接口和程序实现细节上我们都应该采用抽象const。    有时我们可能希望对const做出一些其它的解释那么就要注意了目前大多数对const的解释都是类型不安全的这里我们就不举例子了你可以自己考虑一下总之我们尽量避免对const的重新解释。    3放在类内部的常量有什么限制    看看下面这个例子    class A    {    private:    const int c3 7; // ???    static int c4 7; // ???    static const float c5 7; // ???    ......    };    你认为上面的3句对吗呵呵都不对使用这种类内部的初始化语法的时候常量必须是被一个常量表达式初始化的整型或枚举类型而且必须是static和const形式。这显然是一个很严重的限制    那么我们的标准委员会为什么做这样的规定呢一般来说类在一个头文件中被声明而头文件被包含到许多互相调用的单元去。但是为了避免复杂的编译器规则C要求每一个对象只有一个单独的定义。如果C允许在类内部定义一个和对象一样占据内存的实体的话这种规则就被破坏了。    4如何初始化类内部的常量    一种方法就是static 和 const 并用在内部初始化如上面的例子    另一个很常见的方法就是初始化列表    class A    {    public:    A(int i0):test(i) {}    private:    const int i;    }    还有一种方式就是在外部初始化例如    class A    {    public:    A() {}    private:    static const int i; file://注意必须是静态的    }    const int A::i3;    5常量与数组的组合有什么特殊吗    我们给出下面的代码    const int size[3]{10,20,50};    int array[size[2]];    有什么问题吗对了编译通不过为什么呢    const可以用于集合但编译器不能把一个集合存放在它的符号表里所以必须分配内存。在这种情况下const意味着“不能改变的一块存储”。然而其值在编译时不能被使用因为编译器在编译时不需要知道存储的内容。自然作为数组的大小就不行了    你再看看下面的例子    class A    {    public:    A(int i0):test[2]({1,2}) {} file://你认为行吗    private:    const int test[2];    }    vc6下编译通不过为什么呢    关于这个问题前些时间njboy问我是怎么回事我反问他“你认为呢”他想了想给出了一下解释大家可以看看我们知道编译器堆初始化列表的操作是在构造函数之内显式调用可用代码之前初始化的次序依据数据声明的次序。初始化时机应该没有什么问题那么就只有是编译器对数组做了什么手脚其实做什么手脚我也不知道我只好对他进行猜测编译器搜索到test发现是一个非静态的数组于是为他分配内存空间这里需要注意了它应该是一下分配完并非先分配test[0],然后利用初始化列表初始化再分配test[1],这就导致数组的初始化实际上是赋值然而常量不允许赋值所以无法通过。    呵呵看了这一段冠冕堂皇的话真让我笑死了njboy别怪我揭你短呀我对此的解释是这样的C标准有一个规定不允许无序对象在类内部初始化数组显然是一个无序的所以这样的初始化是错误的对于他只能在类的外部进行初始化如果想让它通过只需要声明为静态的然后初始化。    这里我们看到常量与数组的组合没有什么特殊一切都是数组惹的祸    6this指针是不是const类型的    this指针是一个很重要的概念那该如何理解她呢也许这个话题太大了那我们缩小一些this指针是个什么类型的这要看具体情况如果在非const成员函数中this指针只是一个类类型的如果在const成员函数中this指针是一个const类类型的如果在volatile成员函数中,this指针就是一个volatile类类型的。    7const到底是不是一个重载的参考对象    先看一下下面的例子    class A    {    ......    void f(int i) {......} file://一个函数    void f(int i) const {......} file://上一个函数的重载    ......    };    上面是重载是没有问题的了那么下面的呢    class A    {    ......    void f(int i) {......} file://一个函数    void f(const int i) {......} file://    ......    };    这个是错误的编译通不过。那么是不是说明内部参数的const不予重载呢再看下面的例子    class A    {    ......    void f(int ) {......} file://一个函数    void f(const int ) {......} file://    ......    };    这个程序是正确的看来上面的结论是错误的。为什么会这样呢这要涉及到接口的透明度问题。按值传递时对用户而言这是透明的用户不知道函数对形参做了什么手脚在这种情况下进行重载是没有意义的所以规定不能重载当指针或引用被引入时用户就会对函数的操作有了一定的了解不再是透明的了这时重载是有意义的所以规定可以重载。    8什么情况下为const分配内存    以下是我想到的可能情况当然有的编译器进行了优化可能不分配内存。    A、作为非静态的类成员时    B、用于集合时    C、被取地址时    D、在main函数体内部通过函数来获得值时    E、const的 class或struct有用户定义的构造函数、析构函数或基类时。    F、当const的长度比计算机字长还长时    G、参数中的const    H、使用了extern时。    不知道还有没有其他情况欢迎高手指点    9临时变量到底是不是常量    很多情况下编译器必须建立临时对象。像其他任何对象一样它们需要存储空间而且必须被构造和删除。区别是我们从来看不到编译器负责决定它们的去留以及它们存在的细节。对于C标准草案而言临时对象自动地成为常量。因为我们通常接触不到临时对象不能使用与之相关的信息所以告诉临时对象做一些改变有可能会出错。当然这与编译器有关例如vc6、vc7都对此作了扩展所以用临时对象做左值编译器并没有报错。    10与static搭配会不会有问题    假设有一个类    class A    {    public:    ......    static void f() const { ......}    ......    };    我们发现编译器会报错因为在这种情况下static不能够与const共存    为什么呢因为static没有this指针但是const修饰this指针所以...    11如何修改常量    有时候我们却不得不对类内的数据进行修改但是我们的接口却被声明了const那该怎么处理呢我对这个问题的看法如下    1标准用法mutable    class A    {    public:    A(int i0):test(i) { }    void SetValue(int i)const { testi; }    private:    mutable int test; file://这里处理    }    2强制转换const_cast    class A    {    public:    A(int i0):test(i) { }    void SetValue(int i)const    { const_cast int(test)i; }//这里处理    private:    int test;    }    3灵活的指针int*    class A    {    public:    A(int i0):test(i) { }    void SetValue(int i)const    { *testi; }    private:    int* test; file://这里处理    }    4未定义的处理    class A    {    public:    A(int i0):test(i) { }    void SetValue(int i)const    { int *p(int*)test; *pi; }//这里处理    private:    int test;    }    注意这里虽然说可以这样修改但结果是未定义的避免使用    5内部处理this指针    class A    {    public:    A(int i0):test(i) { }    void SetValue(int i)const    { ((A*)this)-testi; }//这里处理    private:    int test;    }    6最另类的处理空间布局    class A    {    public:    A(int i0):test(i),c(a) { }    private:    char c;    const int test;    };    int main()    {    A a(3);    A* paa;    char* p(char*)pa;    int* pi(int*)(p4//利用边缘调整    *pi5; file://此处改变了test的值    return 0;    }    虽然我给出了6中方法但是我只是想说明如何更改但出了第一种用法之外另外5种用法我们并不提倡不要因为我这么写了你就这么用否则我真是要误人子弟了    12最后我们来讨论一下常量对象的动态创建。    既然编译器可以动态初始化常量就自然可以动态创建例如    const int* pinew const int(10);    这里要注意2点    1const对象必须被初始化所以(10)是不能够少的。    2new返回的指针必须是const类型的。    那么我们可不可以动态创建一个数组呢    答案是否定的因为new内置类型的数组不能被初始化。    这里我们忽视了数组是类类型的同样对于类内部数组初始化我们也做出了这样的忽视因为这涉及到数组的问题我们以后再讨论。(王朝网络 wangchao.net.cn)
http://www.pierceye.com/news/185559/

相关文章:

  • 网站标题加后缀模拟ip访问网站
  • 临清网站建设费用什么是网络营销的基础
  • 街道办的网站由谁做的企业首次建设网站的策划流程
  • 优化大师免费版下载一键优化下载安装
  • 网站建设近五年出版的书籍甘肃省工程建设信息官方网站
  • 杭州网站现场备案项目营销策划方案
  • 网站打包成app软件php网站 上传
  • 行业网站建设策划方案系部网站开发计划书
  • 建设部网站投诉核查做网站一般几个人
  • 360网站推广官网网址怎样在网站做咨询医生挣钱
  • 重庆市建设银行网站一站式网站建设有哪些
  • 自学设计软件的免费网站免费ppt模板简约
  • 申请个人网站怎么申请网站类型有哪些
  • 做网站推广托管注意哪个网站做推广好
  • 大竹网站建设泗阳城乡建设局网站
  • 山东省住房和城乡建设厅服务网站做网站的注意点
  • 网站排名优化软件江西网站备案要求
  • 桐柏县建设局网站邢台建设局网站
  • 网站域名变更怎么查英国做网站的人
  • 嘉兴公司的网站设计wordpress 送女友
  • 10个免费的黑科技网站电子元器件商城网站建设
  • 动画型网站做免费推广的平台
  • 购物网站怎么创建深圳地区5g微波网站建设计划
  • 安做省民改厅网站网站带支付模板
  • 做什么网站吸引人建设网站模板
  • 微信官网网站模板京东云网站建设
  • python 网站开发 前端利用vps做网站
  • 网站做下载功能南昌专业做网站的
  • 白山网站设计网站首页鲁大师
  • 网站怎样和首页做链接地址七星彩的网站怎么做的