이런 코드를 봤는데

소스 코드

#include <iostream>

class Foo {
public:
  int bar;
  Foo(int num): bar(num) {};
};

int main(void) {
  std::cout << Foo(42).bar << std::endl;
  return 0;
}

여기서 : bar(num)처럼 쓰는건 뭔가요?

저렇게 쓰는 걸 처음 봤는데 다른 함수를 호출하는 건가요? 아니면 생성자에서 쓴걸 보면 생성자랑 관련 있는 건가요?


Foo(int num): bar(num) 은 초기화 리스트라고 하고, 멤버 변수 bar를 num으로 초기화하는 역할을 합니다.

//초기화 리스트
Foo(int num): bar(num) {};

//함수에서 초기화
Foo(int num)
{
   bar = num;
}

그냥 생성자 함수{} 내에서 초기화하는 것과, 이렇게 초기화 리스트를 쓰 는것의 차이는

초기화 리스트에서 초기화를 하는 경우, 생성자가 호출될 때 객체의 생성과 초기화가 한 번에 이루어집니다.

생성자 함수 내{}에서 초기화를 하는 경우, 객체가 생성되어, default생성자로 초기화된 상태에서 다시 한 번 할당받게 하게 됩니다. 이 경우엔 default할당-유저할당의 2단계를 거치게 돼서 오버헤드가 생깁니다.

초기화 리스트를 써야만 하는 상황은 크게 다음과 같습니다

  • 클래스가 레퍼런스를 멤버로 가질 때
  • non static const멤버가 있을 때
  • default 생성자가 없을 때
  • base class를 초기화할 때
  • 생성자 파라미터의 이름이 데이터 멤버랑 같을 때(이 경우는 this를 써서 해결할 수도 있습니다)

예를 들면

class MyClass
{
    public:
        int &i; //레퍼런스 멤버. 초기화 리스트를 써야 함
        int b;
        //Non static const 멤버. 초기화 리스트를 써야 함
        const int k;  

    //생성자 파라미터의 이름이 데이터 멤버랑 같음. 초기화 리스트를 쓸수 있음(선택 가능)
    MyClass(int a, int b, int c):i(a),b(b),k(c)
    {
        /*
        초기화 리스트를 쓰고 싶지 않은 경우
        this->a = a
        같이 써야 함
        */
    }
};

class MyClass2:public MyClass
{
    public:
        int p;
        int q;
        //base class인 MyClass가 default생성자가 없기 때문에 무조건 초기화 리스트에서 초기화해줘야 함
        MyClass2(int x,int y,int z,int l,int m):MyClass(x,y,z),p(l),q(m)
        {
        }

};

int main()
{
    int x = 10;
    int y = 20;
    int z = 30;
    MyClass obj(x,y,z);

    int l = 40;
    int m = 50;
    MyClass2 obj2(x,y,z,l,m);

    return 0;
}


서버


1. 서버

-Serv.h


-Serv.cpp

 

-main.cpp(Server)


2. 클라이언트


-main.cpp


mutex를 걸어주는 방법에는 critical section (함수?) 도 있다고 한다.....

EVENT 생성시 마지막 인자로 들어가는 TEXT는 안주는 것이 좋다.

EVENT TEXT가 같으면 다른 프로그램에서도 같은 EVENT로 인식을 하기 때문에


-thread 종료를 시키는 방법


thread들은 while문을 돌때 조건으로 flag check를 한다.

delete(소멸자에서) 할때 flag set을 한뒤 waitEvent

thread에서 set된 flag를 확인하고 while문을 빠져나온다.

while문을 빠져나와 thread를 빠져 나오기전 setEvent를 해주면 이벤트를 기다리던 delete함수가 메모리 해제를 시작한다.



'Programming Language > C++' 카테고리의 다른 글

Why do we need virtual functions in c++?  (0) 2019.04.05
생성자 뒤에 콜론(:)  (0) 2017.03.08
MultiThread Programming  (0) 2016.08.17

소켓통신: http://www.codeproject.com/Articles/11740/A-simple-UDP-time-server-and-client-for-beginners

mutex: https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms686927(v=vs.85).aspx

callback함수: http://stackoverflow.com/questions/10555566/difference-between-c11-stdbind-and-boostbind

http://link2me.tistory.com/40

'컴퓨터 공부 > 컴퓨터구조' 카테고리의 다른 글

인터럽트  (0) 2016.02.03
스택포인터  (4) 2016.01.18
"What is A?"
라는 문장을 변수 a에 넣고 싶다.

그럼 
char* s=malloc(sizeof(char)*10);
scanf("%s",s);
printf("s:%s\n",s);

이런식으로 하면 될까?
위의 결과는
s: What
이다.



"what is A"라는 문장을 사용자가 입력하면 버퍼에 그대로 저장이된다.
그런 뒤 scanf를 사용하면 버퍼에서 공백이 있는 곳까지 잘라 변수에 저장하게 된다. 

프로그램 코드와 실행 결과











이런식으로 코딩하게 되면 "What(space)is(space)A(Enter)"를 입력했을 때
s=What
s1=is
s2=A
가 된다. 

What is A 를 입력한 뒤 다른 입력 없이도 scanf함수를 사용할 때마다 buffer에서 읽어와서 변수에 저장하는 것이당


실행결과




그럼 공백도 포함해서 s에 넣고 싶으면 어쩌나..

fgets를 사용하면 된다. 
fgets(char* s, int size, File* stream);
이런 형태인데 stream으로부터 한줄씩(개행문자가 오기 전까지) 읽어서 s에 넣는 함수이다.
fgets함수 정리는 다음에... 





http://kaspyx.kr/2

int index=0;

printf("%02x",index);


//%(02)x=%(출력하고자하는 자리수)x


printf('%02x",index)의 결과=00

printf('%05x",index)의 결과=00000


set interface ip set address "이더넷" dhcp

Slider가 움직이는대로 ProgressBar움직이게 하기


not in the sudoers file


현재 sudo 권한이 없어서 발생하는 에러이다. 

sudo 그룹에 현재 사용자를 추가해주면 된다.


su - 


명령어를 치면 root 계정으로 바뀌고


su [username] 


명령어를 치면 다른 입력한 username 계정으로 바뀐다.


sudo 권한이 있는 username 이나 이걸 모르면 그냥 root 계정으로 바꾼 후에


sudo adduser [username] sudo


를 입력하면 sudoer 그룹에 username 이 추가되어 sudo 명령어를 수행할 수 있다.


'linux' 카테고리의 다른 글

turn off beep sound on linux  (0) 2018.03.22
vivado GUI xserver permission error  (0) 2018.03.22
printing duplex problem on linux  (0) 2018.03.15
install vivado on linux  (0) 2018.03.15
vim 명령어  (0) 2016.04.11

+ Recent posts