C++中
Const修饰的量叫常量,与普通变量的区别是什么?
C++中有两点
1:编译方式不同,在编译的过程中,所有在程序中出现名字的地方都会被初值替换掉
2:不能作为左值了
const修饰的量常出现的使用错误有
1:常量作为左值修改值 (因为这种方式可以直接修改常量的值)
2:把常量的地址泄漏给一个普通的指针或普通的引用变量 (因为这种方式可以间接修改常量的值如下示例1代码)
示例1:
const int a=10;
int *p =&a; //*p=20; 编译报错 不能将 const int*(整型常量的地址) 赋值给 int *(普通的int指针)
const 和一级指针结合方式有如下种类
C++的语言规范: const修饰的是离他最近的类型
const int *p;
p指针指向的内容不能再被修改,但是p可以指向任意的int类型的内存
int const *p;
这种方式同上
int * const p;
const 修饰的类型是 int *,修饰的表达式是p, 即 p的值(也是地址)不能被修改了,即p不能再指向其他内存地址了,但是p所指向的那个内存的值得内容可以修改 即 *p=200;
const int * const p;
const p 是指 p不能再指向其他内存地址了, const int * 是指 p指向的内容不能在修改了.
示例2:如下
const int b=10;
const int * p=&b;(OK 编译通过)
int *pp=&b (NOT OK, 相当于将 const int * 转为 int *)
int c=10;
int *p1=&c; (OK)
const int *p2=&c; **(OK 相当于将 int * 转为 const int *)**
int * const p3=&c; (OK)
int * p=nullptr;
int * const p1=nullptr;
cout<<typeid(p)<<endl; // 结果是 int *
cout<<typeid(p1)<<endl;// 结果是 int *
**结论:如果const 右侧没有指针即没有*的话,那const不参与类型, 即 int * const p1, 这个const 不参与类型, p1的类型仍然是 int * 见下面代码
所以示例3:
int c=10;
int * const p3 = &c; (OK, int * 转为 int * const 根据上面的结论 const 不参与类型, 其实还是 int * 转为 int *)
示例4:
int x=100;
const int *p=&x;
int *p1=p; // 错误 相当于 const int * 转为 int * 是不可以的
const和二级指针的结合

const 与二级指针的结合分成以下几种
const int ** p
根据C++编程规范,const 修饰离他最近的类型, const 修饰的类型是int ,修饰的表达式是 **p , 是指 **p的值不能被修改
int * const * p
const 修饰的类型是 int*, 修饰的表达式是 *p , 指 *p 的值不能被修改, p的值可以修改 **p 的值也可以修改
int ** const p;
const 修饰的类型是 int** , 修饰的表达式是p ,指p的值不能被修改, *p的值可以修改,**p的值也可以修改
看以下示例是否能通过编译
示例5:
int a =10;
int *p =&a;
const int ** q =&p; (这句话无法通过编译)
上面一行代码相当于 int ** 转成 const int **
怎么理解呢?
如果
int a=10;
int *p=&a;
const int ** q =&p;
上面的代码可以编译通过
首先 *q 和p指向的是同一块内存地址
如果有
const int b=200;
*q =&b;
上面这两行代码,b是const int常量, 现在我们将b的地址放入*q中,即*q=&b,
由于*q和p是同一块内存地址,**那么我们是不是就把一个常量的地址即b的地址,就暴露给了一个普通指针p呢?**
这将会造成通过普通指针p很容易修改常量b的值了,所以const int ** q = &p; 是不可以的。那么怎么解决呢?
**第一种办法:**
直接把int *p 加上const不就可以了吗?不就限制了p修改常量的值了吗?
**第二种办法:**
int a=10;
int *p=&a
const int * const *q=&p;
我就不允许 *q =&b, 不就堵住了把一个常量的地址放入普通指针的口了吗?
示例6:
int a =10;
const int *p =&a;
int ** q =&p; (这句话无法通过编译)
上面一行代码相当于 const int ** 转成 int ** 更加不可以了
如何理解?
const int *p =&a 相当于一级指针P已经做承诺,我指向的内容是不可变的,通过p,是不允许修改指向值得内容的
那么 int ** q =&p ,如果可以通过编译的话,那么我可以 **q 去修改a的值了,那不是让 一级指针的const修饰了个寂寞吗?
同理
int m=10;
int *p=&m;
int ** const q =&p 可以转吗?
int ** const q 只是表达了 *q 的值是不能修改了而且,所以可以转
int n=20;
const int *pp=&n;
int **const q = &pp; 不可以, **q可以修改底层值,然而 pp 是const int *
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我在开发的Rails3网站的一些搜索功能上遇到了一个小问题。我有一个简单的Post模型,如下所示:classPost我正在使用acts_as_taggable_on来更轻松地向我的帖子添加标签。当我有一个标记为“rails”的帖子并执行以下操作时,一切正常:@posts=Post.tagged_with("rails")问题是,我还想搜索帖子的标题。当我有一篇标题为“Helloworld”并标记为“rails”的帖子时,我希望能够通过搜索“hello”或“rails”来找到这篇帖子。因此,我希望标题列的LIKE语句与acts_as_taggable_on提供的tagged_with方法
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在