c++는 가능 한 한\#define 을 사용 하지 않 고 const,enum,inline 으로 교체 합 니 다.

예 를 들 어 이 프로그램 파일 의 시작 부분 에 다음 과 같은\#define 구문
 
#define N 10
#define PI 3.14
#define MAX 10000
#define Heigth 6.65
...
...
이 있 습 니 다.이 프로그램 이 잘못 되 었 다 고 가정 하고 우리 가 이 상수 들 을 사용 하 는 데 오류 가 있 습 니 다.이때 편집기 에서 오류 정 보 를 던 질 것 입 니 다.만약 이 정보 가 6.65 에 오류 가 있다 는 것 을 알려 준다 면,Ok 운 이 좋 으 면 마침 기억 하거나 프로그램 이 간단하게 6.65 가 무엇 을 표시 하 는 지 찾 을 수 있 습 니 다.프로그램 이 복잡 하고 6.65 의 파일 이 이 파일 을 인용 한 것 이 라 고 보고 하면 기억 이 나 지 않 습 니 다.그러면 이것 이 무엇 인지 곤 혹 스 러 울 것 입 니 다.6.65 가 뭔 지 추적 하 는 데 시간 이 많이 걸 릴 것 같 습 니 다.더 나 아가 포 지 셔 닝 문제.왜 오류 메 시 지 는 6.65 입 니까?Heith 가 아니 라?사전 컴 파일 단계 에서 Heigth 대신 5.65 를 사 용 했 기 때문에 Height 는 기호 표(system table)에 들 어가 지 않 았 습 니 다.해결 의 길 은 아래 문 구 를 사용 하여 const double tree Height=5.68 을 교체 할 수 있 습 니 다.하나의 언어 상수 로 서 treeHeight 는 컴 파일 러 에 의 해 알려 지고 기호 표 에 들 어 갈 것 이다.보 고 된 오 류 는 숫자 가 아니 라 변수 이름 으로 포 지 셔 닝 문제 에 유리 하 다.여기 서 상수 교체 에 대해 특별히 설명 합 니 다.첫 번 째 는 상수 지침 을 정의 하 는 것 이다.여기 서 지침 을 상수 지침 으로 정의 하 는 동시에 이 지침 도 상수 로 가리 키 기 때문에 다음 과 같은 형식 입 니 다.const char*const HZ="Hang Zhou";C++에 서 는 char*형식 을 string 대상 으로 대체 하 는 것 이 좋 습 니 다.const std::string HZ("Hang Zhou");두 번 째 로 주의해 야 할 것 은 클 라 스 전속 상수 다.우선 클래스 내 에서 역할 을 제한 하고 구성원 으로 성명 해 야 한다.그 다음 에 이 상수 가 기껏해야 하나의 실체 만 있 도록 확보 하고 static 구성원 이 라 고 불 러 야 합 니 다.예 를 들 어
 
class People
{
private:
static const int Number=10;
int phoneNumbers[Number];
......
}
이것 은 정의 식 이 아니 라 성명 식 을 보 았 다.보통 C++는 사용 하 는 모든 것 에 대해 정의 식 을 요구 합 니 다.또는 enum 을 사용 하여 형식 함수 의 매크로 를 가능 한 한 inline 또는 template 로 대체 합 니 다.그러나 이것 이 class 전속 상수 이자 static 이 며 정수 형식(int,char,bool)이 라면 특수 처리 가 필요 합 니 다.주 소 를 얻 지 않 으 면 정의 식 을 제공 하지 않 고 성명 만 사용 합 니 다.그러나 class 전용 상수 주 소 를 가 져 오 면 주소 컴 파일 러 를 가 져 오지 않 더 라 도 정의 식 을 제공 해 야 합 니 다.static const int People:Number 에서 초기 값 을 설정 하지 않 는 것 은 성명 할 때 초기 값 을 가 져 왔 기 때 문 입 니 다.여기 서 enum 을 사용 하여 유사 한 기능
 
class People
{
private:
enum { Number = 10 };
int phoneNumbers[Number];
....
}
enum 을 완성 할 수 있 습 니 다.const 의 주 소 를 찾 는 것 은 합 법 적 이기 때문에 enum 의 주 소 를 찾 는 것 은 합 법 적 이지 않 습 니 다.\#define 주 소 를 찾 는 것 은 보통 합 법 적 이지 않 습 니 다.그래서 enum 을 통 해 다른 사람 이 상수 의 주 소 를 얻 지 못 하 게 할 수 있 습 니 다.다음은 필기시험 문제
 
#define PRODUCT(a,b) a*b
....
int a=5,b=3,c;
c=PRODUCT(a+3,b+4);
를 소개 합 니 다.그러면 c 의 값 은 얼마 입 니까?c=5+3*3+4=18 은 프로그래머 가 예상 한 56 이 아 닙 니 다.예상 한 결 과 를 얻 으 려 면 이렇게 써 야 합 니 다.\#define product(a,b)((a)*(b))는 매크로 함 수 를 계속 쓸 수 있 습 니 다.매크로 함수 하나만 쓰 면 int,flaot,double 등 유형의 곱 하기 연산 을 완성 할 수 있다 고 말 하고 싶 기 때 문 입 니 다.그럼 다음 예 를 보 겠 습 니 다.\#define MAX(a,b)(a)>(b)?(a):(b)) int a=5,b=3 MAX(++a,b); //a.MAX(+a,b+4)를 두 번 추 가 했 습 니 다.//a 가 한 번 추가 되 었 습 니 다.a 가 추 가 된 결 과 는 예상 한 것 이 아 닐 수도 있 습 니 다.template inline 함수 로 매크로 의 기대 효 과 를 얻 을 수 있 고 효율 과 매크로 의 차이 가 많 지 않 습 니 다.
 
template<typename T>
inline void Max(const T& a,const T& b)
{
f(a>b?a:b);
}
inline 함 수 는 컴 파일 체제 로 코드 에서 볼 수 없 지만 프로그램의 실행 효율 에 있어 차이 가 있 습 니 다.보통 컴 파일 러 가 함수 호출 에 대한 처 리 는 중단 과 유사 한 방식 입 니 다.즉,함수 호출 문 구 를 실행 할 때 현재 의 모든 정 보 를 레지스터 에 저장 하고 함수 의 코드 를 실행 한 후에 레지스터 값 을 되 찾 습 니 다.호출 함수 가 시 작 된 상태 로 돌아 가 코드 를 계속 실행 합 니 다.inline 함수 라 고 밝 힌 후 컴 파일 러 는 함 수 를 호출 함수 로 컴 파일 하지 않 고 호출 된 곳 으로 코드 를 복사 합 니 다.그래서 효율 적 으로 일반 함수 보다 높 고 레지스터 와 레지스터 정 보 를 찾 는 절차 가 적 습 니 다.또한 주의해 야 할 것 은 inline 함수 가.h 파일 에 쓰 거나 클래스 에 직접 쓰 는 것 이 좋 습 니 다.const 는 프로그래머 가 변경 할 수 없 는 의미 제약 을 지정 하도록 허용 합 니 다.컴 파일 러 는 이 제약 을 강제 적 으로 실시 합 니 다.그것 은 그것 에 의 해 수 정 된 값 이 변 하지 않 는 다 는 것 을 나타 낸다.const 는 classes 외부 에서 global 또는 namespace 역할 영역 에서 상수 나 파일,함수 또는 static 대상 및 지침 을 수식 할 수 있 습 니 다.const 에서 포인터 에 사용 할 때 키워드 const 가'*'의 어디 에 나타 나 는 지 주의해 야 합 니 다.왼쪽 에서 가리 키 는 값 이 상수 라면 오른쪽 에서 포인터 자체 가 상수 임 을 나타 내 면 됩 니 다.양쪽 이 나타 나 는 것 은 양자 의 기능 의 집합 을 나타 낸다.여기 서 특히 다음 과 같은 몇 가 지 를 말 합 니 다.(1)교체 기 중의 cosnt const std::vector:iterator iter=vec.begin();/iter 에 해당 하여 std::vector:const 를 변경 할 수 없습니다.iterator citer=vec.begin(); //iter 가 가리 키 는 내용 은 변경 할 수 없습니다(2)함수 반환 값 을 상수 로 설명 하면 프로그래머 의 오류 로 인해 예측 할 수 없 는 상황 을 낮 출 수 있 을 뿐만 아니 라 안전성 과 효율 성 을 포기 하지 않 아 도 됩 니 다.예 를 들 어 const operator*(const&lhs,const&rhs);if((a * b = c);//본래 if(a*b==c)가 프로그래머 의 부주의 로 이렇게 썼 다 는 뜻 이다.a 와 b 가 모두 내 장 된 유형 이 라면 이 코드 는 합 리 적 이지 않 지만 우리 가 유형 을 정의 하면 통할 수 있다.반환 값 이 cosnt 라 고 밝 히 면 예방 할 수 있다.(3)const 구성원 함수,구성원 함수 가 const 대상 에 작용 할 수 있 는 지 확인 하기 위해 서 입 니 다.그리고 두 멤버 함수 가 상수 만 다 르 면 다시 불 러 올 수 있 습 니 다.구성원 함수 뒤에 const 를 따라 이 함수 가 클래스 의 구성원 변 수 를 변경 할 수 없 음 을 표시 합 니 다.(아래 에 코드 검증 이 있 습 니 다.구성원 에 게 값 을 부여 하려 고 하면 컴 파일 러 에 오류 가 발생 할 수 있 습 니 다)원 리 는 컴 파일 러 가 이 를 읽 기 전용 변수 로 여 기 는 것 이다.또한 대부분의 const 대상 은 전달 이나 지침 전달 을 참조 하 는 데 사 용 됩 니 다.
 
#include <iostream>
#include <string>

class People
{
public:
People():m_sName(""),m_iAge(0){}
People(std::string name,int age):m_sName(name),m_iAge(age){}
void set(int age)
{
this->m_iAge=age;
}

void set2(int age) const
{
this->m_iAge=age;
}

int get()
{
return this->m_iAge;
}
private:
std::string m_sName;
int m_iAge;
};

int main(int argc,char **argv)
{
People* p=new People("sky",8);
p->set(10);
std::cout<<p->get()<<std::endl;
p->set2(12);
std::cout<<p->get()<<std::endl;
delete p;
return 0;
}
이 파일 을 컴 파일 하면 다음 과 같은 오류 정보 consttest.cpp: In member function `void People::set2(int) const': const_test.cpp:16: error: assignment of data-member `People::m_iAge' in read-only structure const_test.cpp:36:2:warning:no newline at end of file cosnt 재 부팅(주의:인삼 이 인용 이나 지침 일 때 만 인삼 이 const 인지 여부).다음 코드 의&제거,const 에 전송 해 볼 수 있 습 니 다.int 는 사실 void set(int age)함 수 를 호출 했 는데 형 삼 의 const 가 작용 하지 않 았 다 는 것 을 설명 한다.다음은 인증 코드
 
#include <iostream>
#include <string>
class People
{
public:
People():m_sName(""),m_iAge(0){}
People(std::string name,int age):m_sName(name),m_iAge(age){}
void set(const int& age) const
{
std::cout<<"this is const"<<std::endl;
}

void test(int& age)
{
std::cout<<"this is non-const"<<std::endl;
}

void test(short age)
{
std::cout<<"this is non-const"<<std::endl;
}

int get()
{
return this->m_iAge;
}
private:
std::string m_sName;
int m_iAge;
};

int main(int argc,char **argv)
{
People* p=new People("sky",8);
const int const_int=12;
p->test(const_int);
std::cout<<p->get()<<std::endl;
delete p;
}
(4)재 부팅 함수 코드 중복 에 관 한 문제 입 니 다.경험 을 통 해 알 수 있 듯 이 우리 가 const 를 통 해 다시 불 러 오 는 함 수 는 대량의 코드 가 중복 되 고 심지어 같다.만약 대부분의 중복 코드 가 있다 면,우 리 는 이 중 복 된 코드 를 하나의 함수 로 써 서 각각 호출 할 수 있다.같은 코드 라면,다음 코드 와 같이,우 리 는 non-const 함수 에서 const 함 수 를 호출 하여 코드 중복 을 해결 할 수 있 습 니 다.
 
class People
{
public:
People():m_sName(""),m_iAge(0){}
People(std::string name,int age):m_sName(name),m_iAge(age){}
void eat(const People & Person) const
{
std::cout<<"this person info is:{age ="<<Person.m_iAge()<<",name ="<<Person.m_sName()<<std::endl;
std::cout<<"eating"<<std::endl;
std::cout<<"end"<<std::endl;
}

void eat ( People & Person)
{
std::cout<<"this person info is:{age ="<<Person.m_iAge()<<",name ="<<Person.m_sName()<<std::endl;
std::cout<<"eating"<<std::endl;
std::cout<<"end"<<std::endl;
}
private:
std::string m_sName;
int m_iAge;
};
그리고 non-const eat 함수 에서 먼저*this 유형 을 People&디 스 플레이 에서 const People&호출 const 함수,즉 함수 리 셋
 
#include <iostream>
#include <string>
class People
{
public:
People():m_sName(""),m_iAge(0){}
People(std::string name,int age):m_sName(name),m_iAge(age){}
void eat(const People & Person) const
{
std::cout<<"this person info is:{age ="<<Person.m_iAge<<",name ="<<Person.m_sName<<"}"<<std::endl;
std::cout<<"eating"<<std::endl;
std::cout<<"end"<<std::endl;
}

void eat(People & Person)
{
static_cast<const People&>(*this).eat(Person);
}
private:
std::string m_sName;
int m_iAge;
};

int main(int argc,char **argv)
{
People Person("sky",8);
Person.eat(Person);
}
이 실 행 된 결 과 는 this person info is:{age=8,name=sky eating end 입 니 다.

좋은 웹페이지 즐겨찾기