클래스 키워드

보물창고·2021년 7월 28일
0

const

: c++를 안전하게 동작하기 위한 키워드이다.

  • 붙일수 있는 모든 곳에 붙이자.
    1) 멤버 함수가 멤버 변수의 값을 변경하지 않는다면 함수명 뒤에 붙이자.
    : 의도자체가 변경이 아닌 출력이므로 유저가 함수명 뒤에다가 const를 붙인후, 의도치 않게? 여러가지 요인에 의해 함수명 스코프 안에서
    멤버변수를 변경하려고 하면 컴파일에러를 발생시킨다.

mutable(뮤테이블)

: const 키워드를 무시하는 키워드
-> mutable키워드가 추가된 변수는 const가 붙은 함수에서도 마음대로 변경이 가능하다.
=> 가급적 사용하지 말자.

explicit

: implicit 변환 (암시변환)을 방지하기 위해서이다.


-> 컴파일러가 알아서 생성시킨다.
하지만 객체 생성 측면에서는 올바르지 못하다.

  • 생성자 앞에 explicit 추가

    -> 암시적 변환을 방지


-> 암시적으로 생성하는 것을 방지할 수 있따.

  • 기본생성자의 파라미터가 1개일 경우에 explicit을 무조건 써야한다.

friend

: oop의 컨셉을 무너뜨리므로 가급적 사용을 하지말자.

캡슐화 리턴에 대해


-> 보통 이런식으로 set-, get- 함수를 사용하지만,
set의 경우 복사가 발생할 수 있으므로, 레퍼런스 타입으로 반환시키자.
아래와 같이 사용하는 것이 훨씬 효율적이다.

-> const를 붙인 이유는 레퍼런스 타입반환값이 변경되는 것을 방지하기 위해서이다.

최종 코드

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

class Cat
{
private : 
	int mAge;
	string mName;
public : 

	Cat(string name)
		: mName{ name } {};

	void setAge(int age)
	{
		mAge = age;
	}

	int getAge() const
	{
		return mAge;
	}

	void setName(string name)
	{
		mName = name;
	}

	string getName() const
	{
		return mName;
	}

};

int main()
{
	const Cat kitty{"kitty"};

	string name = kitty.getName(); //deep copy
	const string &nameRef = kitty.getName(); // no deep copy
		
	return 0;
}

=> 결론 : 캡슐화변수를 반환할때 작은 크기의 데이터 int는 바로 리턴해도 상관없지만,
string과 같은 큰데이터는 복사를 방지할 수 있는 const ref 타입으로 반환하도록 하자.

profile
🔥🔥🔥

0개의 댓글