int main()
{
const int* pData = nullptr;
int num[2] = { 4, 5 };
pData = num;
cout << &pData << endl << num << endl;
};
GCC
0x7ffcba93bc28
0x7ffcba93bc20
MSVC
GCC의 경우 연속적인 메모리 배치를 보여주지만, MSVC는 연속적이지 않음을 볼 수 있음.
찾아보니 stack에 지역변수를 할당할 때 메모리 배치 방법은 정의되어 있지 않음.
컴파일러에 따라 가장 최적화된 방식이라고 생각하는 형태로 메모리를 배치.
class Test
{
const int _val = 1;
public:
Test(int val) : _val(val) { }
};
int main()
{
Test t(10);//t_val = 10;
}
class 정의에 값을 미리 넣는 것은 initializer list에 값을 대입한 것과 동일한 효과.
class TestClass
{
public:
int a;
};
class Test
{
public:
int _val = 1;
mutable int _mVal = 1;
TestClass* p;
public:
Test()
{
p = new TestClass;
}
void func() const
{
int t = 1;
_val = 10; //access read-only memory
_mVal = 10;
t = 10;
p->a = 10;
p = new TestClass; //access read-only memory
}
};
const 함수는 멤버 변수의 변화를 불허.
단, 지역 변수는 상관 없음.
mutable 키워드 시 수정 가능.
포인터의 경우 포인터만 변경 불가.
포인터 내부 값은 변경 가능.
class Test
{
private:
int a = 0;
public:
int& func() { return a; }
};
int main()
{
Test t;
int& b = t.func();
b = 10;
cout << t.func();//10
return 0;
}
위와 같은 방식으로 수행 가능.
const int& func();
int b = t.func();
할당 불가.
const int func();
int b = t.func();
수행 가능.
class TestClass
{
public:
int a = 0;
};
class Test
{
private:
int a = 0;
public:
const TestClass func() { return TestClass(); }
};
int main()
{
Test t;
TestClass tc = t.func();
tc.a = 10;
return 0;
}
수행 가능.
const_cast를 통해 상수성을 지울 수 있음.
non-const한 변수에 const-pointer로 접근한 상황에서 pointing값을 변경하고 싶을 때 사용.
override키워드 필요 없음.
opeartor++() : 전위 연산자
operator++(int) : 후위 연산자, int만 가능.
operator+ 는 RValue 반환형.
operator+=는 Reference 반환형.
class Test
{
public:
Test& operator<<(int a) { cout << a << endl; return *this; }
};
int main()
{
Test t;
t << 1 << 2 << 3;
//1
//2
//3
return 0;
}
왼쪽부터 수행되는 것을 확인 할 수 있음.
#include <iostream>
using namespace std;
class Test
{
public:
Test& operator+(int a) { cout << "Plus" << a << endl; return *this; }
Test& operator*(int a) { cout << "Multi" << a << endl; return *this; }
};
int main()
{
Test t;
t + 3 * 2;
return 0;
}
output : Plus6
operator 연산자의 우선순위는 유지됨.
위의 경우 3 * 2가 먼저 수행되어 t + 6으로 변형됨.