constant *p vs. int constant *p - 유형 다음에 const를 허용합니까?
동료가 영감을 준 질문(1, 2)에 대해 2점 만점에 0점을 받았기 때문에 따라잡을 수 있는 기회를 줘야겠다고 생각했습니다.
를 둘 에 대한 입니다.const
그는 그것이 활자 앞이나 포인터 뒤에 가야 한다는 것입니다.그 이유는 이것은 일반적으로 다른 사람들이 하는 것이고 다른 스타일은 혼동되기 쉽기 때문입니다..int, 에 상수 .int각각 다음과 같습니다.
const int *i;
int * const i;
그런데 저는 어쨌든 혼란스럽습니다.하고 고합니다'을할 수 이 필요합니다.const" 수정하고 있는 것을 쫓는다는 것입니다.최종 타입 앞으로 갈 수 있는 예외가 있는데, 그건 예외이기 때문에 안 쓰면 저한테 더 편합니다.
.int, 에 상수 .int각각 다음과 같습니다.
int const * i;
int * const i;
추가적인 이점으로, 이러한 방식으로 작업을 수행하면 더 깊은 수준의 간접 지시를 쉽게 이해할 수 있습니다.를 들어,어에 ,int분명히 다음과 같습니다.
int * const * i;
제 주장은 만약 누군가가 그의 방식대로 그것을 배운다면, 그들은 위의 것이 무엇인지 알아내는 데 거의 문제가 없을 것이라는 것입니다.
가 를 넣는 입니다.constint말로 표현할 수 없을 정도로 추하고 가독성에 너무 해롭기 때문에 스타일 가이드에서 금지해야 합니다.물론, 가이드가 제 방식대로 하는 것을 제안해야 한다고 생각하지만, 어느 쪽이든 우리는 한 가지 접근을 금지해서는 안 됩니다.
편집: 좋은 답변을 많이 받았지만, 제 마지막 단락("최종 문제")을 직접적으로 다루는 사람은 아무도 없습니다.많은 사람들이 일관성을 주장하지만, 이 경우 그것이 단지 그것을 좌절시키는 것보다 그것을 하는 다른 방법을 금지하는 것이 좋은 생각이라는 것이 그렇게 바람직한 것입니까?
가장 중요한 것은 일관성입니다.이에 대한 코딩 지침이 없으면 하나를 골라 고수하세요.하지만 팀에 이미 실질적인 기준이 있다면 변경하지 마십시오!
그렇기는 하지만, 제 생각에 더 일반적인 것은
const int * i;
int * const j;
대부분의 사람들이 글을 쓰기 때문입니다.
const int n;
대신에
int const n;
- 를 수 있는 방법 - const ness 는입니다.
const int * i; // pointer to an int that is const
int * const j; // constant pointer to a (non-const) int
int const * aLessPopularWay; // pointer to a const int
를 const활자의 오른쪽에 있는 것 또한 혼동을 방지하는 데 도움이 됩니다.
유형 디프에 포인터 유형이 있는 경우 다음과 같이 유형의 일관성을 변경할 수 없습니다.
typedef int * PINT;
const PINT pi;
pi다 이 아직 .int * const는 에 쓰든 입니다.const.
나는 이 설명을 B로부터 받기를 바랍니다.Stroustrup의 Style & Technique에 대한 FAQ를 통해 확실한 답변을 얻을 수 있을 것입니다.
Bjarne Strostrup의 C++ 스타일과 테크닉 FAQ
개인적으로 선호하는 것은:
int const* pi;
int* const pi;
.const고정할 왼쪽 토큰을 식별합니다.
smth를 그런 식으로 사용할 때는 확실히 동일한 일관성을 유지합니다.
int const* const pi;
일관성 없이 쓰는 대신:
const int* const pi;
포인터를 포인터로 연결할 경우 다음과 같은 일이 발생합니다.
int const* const* const pi;
대신:
const int* const* const pi;
를 하는 는 는 Bjarne Strostrup 했습니다 했습니다.const int* i에게 왜 () : . 했습니다.
"사람들은 보기를 좋아합니다.
const무엇인가가 일정할 때 먼저."
으로 user를 합니다.const int* blah영어처럼 잘 읽히기 때문입니다.저는 그것의 유용성을 과소평가하지 않을 것입니다.
나는 그것을 발견합니다.int* const blah변동이 드물기 때문에 일반적으로 더 일반적인 정의를 거꾸로 만드는 것은 유용하지 않습니다.저는 일반적으로 예외적인 경우에는 명목상의 이익을 제공할 수 있지만 일반적인 경우에는 코드를 조금이라도 가리는 것을 좋아하지 않습니다.
또한 "if (1 == a)"를 참조하십시오.어떤 사람들은 영어로 읽지 않는 코드를 쓰는 것을 정말로 즐깁니다.저는 그런 사람이 아닙니다.
하지만 실제로 규칙은 간단합니다.왼쪽을 보고 오른쪽을 보세요.너무 간단해서 스타일 가이드에서는 별로 신경 쓸 가치가 없다고 생각합니다.
이 변수와 만 있다면 은 가 될 수 있습니다.const그렇지 않든 간에, 그것은 아마도 그렇게 중요하지 않을 것입니다.그러나 다음을 고려합니다.
class MyClass
{
public:
int foo() const;
};
가 도 안돼요!const그것이 말하는 함수를 추적하는 것을 제외하고는 다른 곳에 쓸 수 있습니다.
스타일 가이드가 짧을수록 개발자들이 이를 따를 가능성이 높습니다.그리고 가능한 가장 짧은 규칙이자 일관성을 제공하는 유일한 규칙은 다음과 같습니다.
const키워드는 무엇을 가리키든 항상 추적합니다.
그래서 여기 있는 동료에게 0:3이라고 말하고 싶습니다.
"궁극적인 문제"와 관련하여:스타일 가이드의 경우, 가이드가 자신이 말하는 것들을 "격언"하거나 "금지"하거나 하는 것은 중요하지 않습니다.그것은 사회적인 문제이고, 정책입니다.스타일 가이드 자체는 최대한 간결하고 짧아야 합니다.긴 스타일의 가이드는 (누군가 탓할 사람을 경계하는 경영진을 제외하고) 모두에게 무시당하기 때문에, 그저 "한다" 또는 "하지 않는다"라고 쓰고, 다른 곳에서 가이드를 위반한 경우(예: 동료 검토가 어떻게 이루어지고 있는지에 대한 회사 정책) 무엇을 하는지를 설명합니다.
간에 ,const int그리고.int const 두 을 모두 본 적이 다)다 간에는 가 있습니다.const int *그리고.int * const.
첫번째로, 당신은 상수를 가리키는 포인터를 가지고 있습니다.포인터를 변경할 수는 있지만 포인터가 가리키는 값은 변경할 수 없습니다.두 번째에는 int에 대한 상수 포인터가 있습니다.포인터를 변경할 수는 없지만 포인터 값을 변경할 수 있습니다.
는 입니다.const int *그리고.int const * 다
하세요를 하세요.*꼭 당신이 원하는 대로 작동하는 것은 아닙니다.은.int x, y;만,int* x, y;는 t 는 int에와를합니다합니다.
유형 선언 뒤에 "const"를 넣는 것은 C++ 유형 선언을 오른쪽에서 왼쪽으로 읽는 훈련을 받으면 훨씬 더 합리적입니다.
너의 암소꾼을 3타석에 0대 0으로 고정할거야 :)
개인적으로 저는 (그리고 그것은 개인적인 선호입니다) 오른쪽에서 왼쪽으로 읽는 유형의 선언문을 가장 쉽게 찾을 수 있습니다.특히 당신이 믹스에 레퍼런스를 던지기 시작했을 때 말이죠.
std::string const& name = plop; // reference to const string.
const std::string& flame =plop; // reference to string const;
// That works better if you are German I suppose :-)
여기서의 궁극적인 문제는 그가 int 뒤에 const를 붙이는 것은 말로 표현할 수 없을 정도로 추하고 가독성에 너무 해롭기 때문에 스타일 가이드에서 금지되어야 한다고 생각한다는 것입니다.
정말?
다음을 보면 수렁에 빠진 프로그래머의 모습을 보여주세요.
int foo() {
}
대
int foo()
{
}
...세부적인 부분에는 신경을 쓰지 않는 프로그래머를 보여드리겠습니다.
자신의 가치가 있는 프로 프로그래머는 스타일의 피상적인 차이에 문제가 없을 것입니다.
편집: constint*와 int* const가 정확히 같은 의미가 아닌 것은 사실이지만, 그것이 중요한 것은 아니었습니다.OP의 동료가 지적한 점은 스타일의 차이가 코드를 이해하고 유지하기 어렵다는 것이었습니다.그것은 제가 동의하지 않는 주장입니다.
제 ¢ 2명을 토론에 투입하겠습니다.
에서는 의 C++ 를 int constconst intconst그리고.constexpr하는 데 이 될 . 입니다.const int컴파일 시간 상수라고 항상 생각할 수는 없습니다.
- 컴파일러는 메모리를 할당할 수 있습니다(will?
- 이 메모리는 쓰기 방지되지 않을 수도 있습니다(스택 세그먼트).
- 그런 상수가 모든 임무를 수행할 수 있는 것은 아닙니다.
규칙은 지켜야 합니다.간단한 규칙이 더 좋습니다.Const는 Const의 오른쪽으로 갑니다.
다음과 같은 선언을 합니다.
int main (int constargc, charcst * constargv ) ...
두 분의 의견에 동의합니다.타입 뒤에 const를 붙여야 합니다.저는 그것을 보고 있으면 반드시 파괴되어야 할 혐오감을 느끼게 됩니다.하지만 최근에 상수 값 매개 변수에 대한 놀라운 시도를 하면서 상수를 두 번째로 두는 것이 타당한 이유를 이해하게 되었습니다.
int *
int const *
int * const
int const * const
보기만 해도 목에 털이 서 있습니다.제 동료들에게 혼란을 줄 거라고 확신합니다.
편집: 수업시간에 이걸 사용하는 게 궁금했어요.
class Foo {
Bar* const bar;
Foo(const Foo&) = delete; // would cause too many headaches
public:
Foo() : bar(new Bar) {}
~Foo() { delete bar; }
};
bar합니다.Bar&그러나 이는 힙에 있으며 삭제할 수 있습니다.각 Foo의 평생 동안, 그와 연관된 단일 바가 존재합니다.
저는 "매니페스트 상수"를 선언할 때 다음과 같은 양식을 사용하고 싶습니다.이 경우에는 값 자체가 상수이므로 (Bjarne과 동일하게) "const"를 먼저 두어 컴파일 시에 일정성이 나타나야 하며 컴파일러에 의한 특정 최적화에 사용할 수 있어야 함을 강조했습니다.
const int i = 123;
값을 수정하는 데 사용되지 않을 참조를 선언하기 위해 식별자가 "상시 참조"라는 사실을 강조하는 다음 양식을 사용합니다.참조된 값은 상수이거나 상수가 아닐 수 있습니다.[관련 토론:함수 매개 변수가 포인터나 참조가 아닌 경우 함수 매개 변수에 "const"를 사용하시겠습니까?함수 매개변수에 'const' 사용]
void fn( int const & i );
포인터의 경우 참조에 사용하는 것과 동일한 양식을 사용하는데, 이는 본질적으로 동일한 이유 때문입니다(비록 "상시 참조"보다 "상시 포인터"라는 용어가 조금 더 모호해 보이지만).
void fn( int const * i );
또한 다른 포스터에서 언급한 것처럼 여러 수준의 간접이 있을 경우에도 이 양식은 일관성을 유지합니다.
void fn( int const * const * i );
C++를 사용해 본 경험으로는 포인터가 일정하다고 선언하는 최종 시나리오는 거의 없습니다.어쨌든 여기선 선택의 여지가 없어요[이 사례는 가장 일관된 접근 방식이 유형 뒤에 "const"라는 단어를 넣는 것임을 보여줍니다. 이는 실제로 이 특정 선언에 필요하기 때문입니다.]
void fn( int * const i );
타이프를 사용하지 않는 한 말입니다
typedef int * IntPtr;
void fn1( const IntPtr i );
void fn2( IntPtr const i );
마지막 메모 하나:하위 도메인에서 작업하지 않는 한 대부분의 C++ 코드는 포인터를 선언하지 않습니다.따라서 이 논의의 그러한 측면은 아마도 C와 더 관련이 있을 것입니다.
최신 C++11에서는 템플릿 유형의 디프를 사용하여 복잡한 선언에 명확성을 추가할 수도 있습니다.
template<typename T>
using Const = const T;
template<typename T>
using Ptr = T*;
질문에서 언급하신 3가지 선언문은 다음과 같습니다.
int const * a;
int * const b;
int * const * c;
그러면 다음과 같이 적을 수 있습니다.
Ptr<Const<int>> a;
Const<Ptr<int>> b;
Ptr<Const<Ptr<int>>> c;
언급URL : https://stackoverflow.com/questions/988069/const-int-p-vs-int-const-p-is-const-after-the-type-acceptable
'programing' 카테고리의 다른 글
| WP 플러그인 업그레이드 후 Google Maps API V3 오류 발생 (0) | 2023.09.19 |
|---|---|
| phpMyAdmin에 정의된 "내부 관계"란 무엇입니까? (0) | 2023.09.19 |
| zip 파일 다운로드 방법 (0) | 2023.09.19 |
| WooCommerce 카트 유효성 검사에 추가: 카트에 추가하지 않음 (0) | 2023.09.19 |
| 아직 첨부되지 않은 경우 Larvel 관계가 첨부 (0) | 2023.09.19 |