1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

constをつける場所は3つある

Last updated at Posted at 2019-04-15

ポインタにconstをつける時, 書く場所が2か所あるのは知っていましたけど3つ目は知りませんでした.
型名と*の間にconstをつけると, 先頭にconstを書いたのと同じ意味になります.
書くときは先頭に書く方だけ覚えておけばいいと思いますが, 他人のコードを読むときの参考までに

struct Vec2
{
    int x = 0;
    int y = 0;
};

int main()
{
  Vec2 a {1, 2};
  Vec2 b {2, 3};
  
  // 1). [const 型名*]はその変数の中身を変更できない
  const Vec2* p1 = &a;
  p1->x = 10;  // Error
  p1    = &b;  // OK 
  
  // 2). [型名* const]はその変数自身に別のポインタを代入できない
  Vec2* const p2 = &a;
  p2             = &b; // Error
  p2->x          = 10; // OK
  
  // 3). [型名 const *]はその変数の中身を変更できない. 1)と同じ意味
  Vec2 const* p3 = &a;
  p3->x           = 10;  // Error
  p3              = &b;  // OK
  
  // 4). 両方につけるとどっちもできない
  const Vec2* const p4 = &a;
  p4                   = &b; // Error
  p4->x                = 10; // Error
  
  Vec2 const * const p5 = &a;
  p5                    = &b; // Error
  p5->x                 = 10; // Error
 
  // 5). 1)と3)どっちもつけると dupulicate constというエラーになる    
  const Vec2 const* p6 = &a;
  p6                   = &b; // Error
  p6->x                = 10; // Error  
}

2019/04/17 追記 ----
コメントに非常にわかりやすい説明があるのでそちらもご覧ください。

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?