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#include #include 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 #include #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 #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 #include #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 #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 #include #include 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 #include #include #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 #include #include #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 #include #include #include "Student.h" using namespace std; int main() { char a; cout<<"hi,zhangsan"< >a; cout<<"a is "< #include #include #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< #include
#include #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 #include #include #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 #include #include #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; }