結構體、類、建構函式、拷貝建構函式
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;
}