博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ const放置的位置
阅读量:6250 次
发布时间:2019-06-22

本文共 3977 字,大约阅读时间需要 13 分钟。

标准中int const a 与 const int a 是完全等价的。正因为如此,会有很多各种不同的风格,同样的还有“*是跟类型还是变量?”,比如char* p与 char *p,它们是等价的。

是采用const T& t还是 T const& t呢

是采用int* a 还是int *a呢

 

我在看《C++ Templates中文版》时,它里面特别提到要使用 int const 这种定义,函数参数定义也是这个写的

T addValue(T const& x) {

     //

}

如果是string类型,它是这样写的string const& str

这种写法也我觉得很怪异,特别是我见到的大多数C++不是这样定义的。比如我看V8的源码一般是这样定义的:

static bool EnableAgent(const char* name, int port);
static void SendCommand(const uint16_t* command, int length,                         ClientData* client_data = NULL);
/**    * Allocates a new string from either utf-8 encoded or ascii data.    * The second parameter 'length' gives the buffer length.    * If the data is utf-8 encoded, the caller must    * be careful to supply the length parameter.    * If it is not given, the function calls    * 'strlen' to determine the buffer length, it might be    * wrong if 'data' contains a null character.    */   static Local
New(const char* data, int length = -1);   /** Allocates a new string from utf16 data.*/   static Local
New(const uint16_t* data, int length = -1);   /** Creates a symbol. Returns one if it exists already.*/   static Local
NewSymbol(const char* data, int length = -1);

 

我看陈硕老师的muduo源码也是上面这种风格:

//https://github.com/chenshuo/muduo/blob/master/muduo/net/Socket.cc void Socket::bindAddress(const InetAddress& addr) {
  sockets::bindOrDie(sockfd_, addr.getSockAddrInet()); }   void Socket::listen() {
  sockets::listenOrDie(sockfd_); }   int Socket::accept(InetAddress* peeraddr) {
  struct sockaddr_in addr;   bzero(&addr, sizeof addr);   int connfd = sockets::accept(sockfd_, &addr);   if (connfd >= 0)   {
    peeraddr->setSockAddrInet(addr);   }   return connfd; }

 

而我看lua的源码(C语言的),是这样定义的:

static int handle_luainit (lua_State *L) {
  const char *init = getenv(LUA_INIT);   if (init == NULL) return 0;  /* status OK */   else if (init[0] == '@')     return dofile(L, init+1);   else     return dostring(L, init, "=" LUA_INIT); }   struct Smain {
  int argc;   char **argv;   int status; };   static int pmain (lua_State *L) {
  struct Smain *s = (struct Smain *)lua_touserdata(L, 1);   char **argv = s->argv;   int script;   int has_i = 0, has_v = 0, has_e = 0;   globalL = L;   if (argv[0] && argv[0][0]) progname = argv[0];   lua_gc(L, LUA_GCSTOP, 0);  /* stop collector during initialization */   luaL_openlibs(L);  /* open libraries */   lua_gc(L, LUA_GCRESTART, 0);   s->status = handle_luainit(L);   if (s->status != 0) return 0;   script = collectargs(argv, &has_i, &has_v, &has_e);   if (script < 0) {  /* invalid args? */     print_usage();     s->status = 1;     return 0;   }   if (has_v) print_version();   s->status = runargs(L, argv, (script > 0) ? script : s->argc);   if (s->status != 0) return 0;   if (script)     s->status = handle_script(L, argv, script);   if (s->status != 0) return 0;   if (has_i)     dotty(L);   else if (script == 0 && !has_e && !has_v) {
    if (lua_stdin_is_tty()) {
      print_version();       dotty(L);     }     else dofile(L, NULL);  /* executes stdin as a file */   }   return 0; }

上面很明显是C与C++不同的风格。后来通过搜索,发现wiki百科里有关于const的一些详细说明:

 

不过*与类型靠在一起还是与指针变量靠在一起,我发现Facebook中同一个cpp中就存在二种不同的形式:

 

cocos2d-x的官方源码也有这个问题:

 

 

C中的习惯 int *ptr,说明*ptr是一个int类型,ptr是指定int的一个指针

int const *ptr 说明*ptr是一个常量,一个int型的常量

int * const ptr  ptr是一个常量,一指针类型(int *)的常量

 

C++将*与类型关联起来,比如 int* a,所有就出现了上面C++的那种风格。在c++中为了避免疑惑,虽然const int* p与int const* p等价,但为了防止与int * const p太过相似,我觉得还是采用const int* p这种比较适合(语义上int const表达更为适合,表示const是限定int的)。int* const p来定义指针常量。

表达的意思:*(指针)与 const(常量限定符)谁在前面先读谁,* 象征着地址,const 象征着内容。

 

const int * p  常量指针,p是指针,指向常量的指针。

常量const在前 *指针在后,const 限定 * ,所以不能使用*p = xx进行修改,但是可以通过p = &b来修改指针变量的值。

 

int* const p 指针常量,p是指针,是一个常量的指针,地址不允许被修改,所以p = &b是非法的,但是可以改变它指向的值 *p = b;

 

p永远是指针,给指针赋值使用&取地址的操作符,如果const 在 p之前,说明它是一个(常量的)指针,其值是不能变化的

 

最近在看《C++编程思想》里面单独有一章写const,刚看一点就联想起之前看的《C++ Template中文》后有些困惑。现在理清楚了,反而觉得比较轻松。里面提到C 与 C++在const的处理上还是有区别的,这里我还没完全理解透彻,等完全搞明显了可能会再写一篇文章。

转载地址:http://toysa.baihongyu.com/

你可能感兴趣的文章
C++ 与OpenCV 学习笔记
查看>>
【CV学习7】FAST算法详解
查看>>
11月20日学习内容整理:jquery插件
查看>>
预科班第四次考核总结
查看>>
【js】再谈移动端的模态框实现
查看>>
html
查看>>
Java变量类型
查看>>
[leetcode-89-Gray Code]
查看>>
mysql 存储过程的基本语法知识
查看>>
数据分析师到底在做什么?
查看>>
pt-heartbeat工具监控MySQL复制延迟
查看>>
指尖下的js —— 多触式web前端开发之三:处理复杂手势(转)
查看>>
spring boot项目配置文件集合
查看>>
cube-ui的用法
查看>>
2015.4.21 SetWindowPos函数用法
查看>>
2011-12-14 调用cmd并获得输入输出+网络访问
查看>>
解决nim db_mysql could not load: libmysql.dll的问题
查看>>
JavaScript之再谈回调与闭包
查看>>
优化PHP代码的一些建议
查看>>
android学习网站
查看>>