C++語言之結構體、類、建構函式、拷貝建構函式

魚弦發表於2016-09-27


結構體、類、建構函式、拷貝建構函式

1、結構體
C     
C++

區別:
1、定義變數時,stuct可以省略嗎?
2、C++中的結構體 可以加函式原型
		加了函式的好處:通過stu變數,不但可以得到stu.number、stu.name,還可以執行stu.print_student()函式(不需要自己寫printf列印資訊了)
注意:
當C++結構體中,增加了函式後,就不能使用	SStudent stu={1001,"zhangsan"}; 的方式來定義和變數和賦值了,只能分步進行,即:
	SStudent stu;
	stu.number=1001;
	stu.name=(char *)malloc(20);
	strcpy(stu.name,"zhangsan");


	


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student
{
	int number;
	char *name;
	void print_student()
	{
		printf("number is %d\tname is %s\n",number,name);
	}
};

int main()
{
	//Student stu[2]={1001,"zhangsan",1002,"lisi"};

	Student stu={1001,"zhangsan"};
	//printf("number is %d\tname is %s\n",stu.number,stu.name);
	stu.print_student();
	
	return 0;
}



2、使用VC工具,將SStudent型別,自動由Student.h和Student.cpp來組成和建立
注意:VC工具預設為class,我們可以將其修改為 struct
生成的多檔案程式碼如下:

//main.cpp
#include <string.h>
#include <stdlib.h>
#include "Student.h"
int main()
{	
	//SStudent stu={1001,"zhangsan"};  如果結構體中有了建構函式,就不能這樣用了
	SStudent stu;
	stu.number=1001;
	stu.name=(char *)malloc(20);
	strcpy(stu.name,"zhangsan");
	stu.print_student();	
	return 0;
}




// Student.h: interface for the SStudent class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_STUDENT_H__C349E43A_0B9E_4447_BC45_3F4DFF0FE415__INCLUDED_)
#define AFX_STUDENT_H__C349E43A_0B9E_4447_BC45_3F4DFF0FE415__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

struct SStudent  
{
	int number;
	char *name;
	void print_student();
	SStudent();
	virtual ~SStudent();

};

#endif // !defined(AFX_STUDENT_H__C349E43A_0B9E_4447_BC45_3F4DFF0FE415__INCLUDED_)






// Student.cpp: implementation of the SStudent class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "Student.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

SStudent::SStudent()
{

}

SStudent::~SStudent()
{

}

void SStudent::print_student()
{
	printf("number is %d\tname is %s\n",number,name);
	return;
}



C++中的結構體------C++中的類
區別:預設   公共public-------私有private




類的:四大成員函式
建構函式
拷貝建構函式
賦值函式
解構函式


1、建構函式

物件-----就是 C語言中的變數
         資料型別是class的變數
         
特點:定義物件時,自動呼叫 建構函式         



//main.cpp
#include <string.h>
#include <stdlib.h>
#include "Student.h"
int main()
{	
	//SStudent stu={1001,"zhangsan"};  如果結構體中有了建構函式,就不能這樣用了
	SStudent stu(1003,"wangwu");
	//stu.number=1001;
	//stu.name=(char *)malloc(20);
	//strcpy(stu.name,"zhangsan");
	stu.print_student();	
	return 0;
}


//Student.h
// Student.h: interface for the SStudent class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_STUDENT_H__C349E43A_0B9E_4447_BC45_3F4DFF0FE415__INCLUDED_)
#define AFX_STUDENT_H__C349E43A_0B9E_4447_BC45_3F4DFF0FE415__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class SStudent  
{
public:
	int number;
	char *name;
	void print_student();
	SStudent();
	SStudent(int number,char *name);
	virtual ~SStudent();

};

#endif // !defined(AFX_STUDENT_H__C349E43A_0B9E_4447_BC45_3F4DFF0FE415__INCLUDED_)




//Student.cpp
// Student.cpp: implementation of the SStudent class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "Student.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

SStudent::SStudent()
{
	number=999;
}

SStudent::~SStudent()
{

}

void SStudent::print_student()
{
	printf("number is %d\tname is %s\n",number,name);
	return;
}

SStudent::SStudent(int number,char *name)
{
	this->number=number;
	this->name=name;
	
}


知識點:
函式的過載:
	特點1:函式名一樣-----引數不一樣    所以可以區別開
	特點2:同1個類裡的 2個函式名 相同------無參建構函式、有參建構函式
	
其實,不在同一類下的2個函式,也可能是函式過載-----------它們都是 外部函式時(沒有在類裡)------但C++專案中,會杜絕這樣的用法	



拷貝建構函式
	特點1:本質上還是建構函式
	特點2:系統有預設的拷貝建構函式,但它是 淺賦值(this->name=name)
	特點3:因為淺賦值,通常會出問題,所以一般要重寫

int main()
{	

	SStudent stu1(1003,"wangwu");
	//SStudent stu2(1003,"wangwu");
	SStudent stu2(stu1);
	stu2.print_student();

	return 0;
}



新知識點:
引用
	特點1:C++有,C沒有
	特點2:函式傳遞時,使用的是真品,而不是複製品
	特點3:平時不用。

例子:利用引用 來交換2個數
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void swap(int &a,int &b)
{
	int temp;
	temp=b;
	b=a;
	a=temp;
	return;
}

int main()
{	
	int a=10;
	int b=20;
	swap(a,b);
	printf("a=%d\tb=%d\n",a,b);

	return 0;
}


難點:
1、引用
	引用  就  外號、真名、字
	
int main()
{	

	int a=10;
	int &aa=a;		//aa是a的外號。以後改aa,就是改a;改a,就是改aa.
	//aa=20;
	a=22
	printf("a=%d\n",aa);
	return 0;
}	


2、建立類的時候,對.h   .cpp不是很理解
使用vc的 class view,在專案上點 右鍵-----新建類
自動生成
.h   --------C:函式原型        C++:類的原型(包含了 函式原型) 
.cpp --------c:定義函式       c++:定義類中的 函式





int main()
{
	CStudent stu1(1001,"zhangsan");
	stu1.print_student();


	return 0;
}


C++中,定義變數的方式 有2種:
int main()
{
	int a(1000);//int a=10       等價

	char ch('m');//char ch='m'   等價
	printf("%c\n",ch);

	return 0;
}



這2種方式,引出了下列的程式碼:

//main.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "Student.h"

int main()
{
	CStudent stu1=1001;  //	等價於該語句 CStudent stu1(1001);  根據該語句,在Student.h中寫 有參建構函式的原型;在Student.cpp中寫 有參建構函式的定義
	stu1.print_student();
	return 0;
}	


//Student.h
class CStudent  
{
public:
	int number;
	char *name;
	CStudent();
	CStudent(int number,char *name);
	virtual ~CStudent();
	void print_student();
	CStudent (int number);

};



//Student.cpp
// Student.cpp: implementation of the CStudent class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Student.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CStudent::CStudent()
{

}

CStudent::~CStudent()
{

}

CStudent::CStudent(int number,char *name)
{

	this->number=number;
	this->name=(char *)malloc(strlen(name)+1);
	strcpy(this->name,name);
}

void CStudent::print_student()
{
	printf("number is %d  name is %s\n",number,name);
	return;
}

CStudent::CStudent (int number)
{
	this->number=number;
	name=(char *)malloc(1);
	strcpy(name,"");
}



C++中更好的輸入輸出 語句:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "Student.h"
using namespace std;

int main()
{
	char a;
	cout<<"hi,zhangsan"<<endl;
	cout<<"請輸入1個字元:";
	cin>>a;
	cout<<"a is "<<a<<endl;
	return 0;
}


cout-------顯示器檔案
cin--------鍵盤檔案



C++中更好的動態記憶體分配方法:
new   		-----特點:跟資料型別
delete		-----最好加 []
知識點:-------是運算子
malloc  free------是函式


#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "Student.h"
using namespace std;

int main()
{
	//int *p=malloc();
	int *p=new int;	//int *p=new int[10];   CStudent *p=new CStudent[10];
	*p=99;
	cout<<p<<endl;
	cout<<*p<<endl;

	//free(p);
	delete []p;	//中括號可以保證,釋放全。否則,可能只釋放第1個元素的記憶體空間(資料型別是 CStudent *)
	

	return 0;
}


//使用new delete進行 學生物件的 建立和釋放

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "Student.h"
using namespace std;

int main()
{
	//CStudent stu1(1001,"zhangsan");
	CStudent *pstu=new CStudent(1001,"zhangsan");
	pstu->print_student();
	delete []pstu;
	return 0;
}


//使用new delete   -----陣列
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "Student.h"
using namespace std;

int main()
{
	//CStudent stu1(1001,"zhangsan");
	CStudent *pstu=new CStudent[2];
	pstu[0].number=1001;
	pstu[0].name=new char[10];
	strcpy(pstu[0].name,"zhangsan");

	pstu[1].number=1002;
	pstu[1].name=new char[10];
	strcpy(pstu[1].name,"lisi");

	pstu[0].print_student();
	pstu[1].print_student();

	delete pstu[0].name;
	delete pstu[1].name;
	delete []pstu;

	return 0;
}



拷貝建構函式的2種形式:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "Student.h"
using namespace std;

int main()
{
	CStudent stu1(1001,"zhangsan");
	//CStudent stu2(stu1);  與下面語句 完全等價----CStudent stu2=1001;
	CStudent stu2=stu1;

	stu2.print_student();

	return 0;
}





相關文章