再此記錄自己學習的過程,如有錯誤,歡迎大家指出。
1.初步看看結構體和類在語法上的一點區別
#include <iostream>
#include <stdio.h>
/*
day1:類的引入
例子:輸出人名,年齡,職業
c:使用結構體輸出
c++:使用類的方式輸出
*/
//C
struct C_person
{
char *name;
int age;
char *work;
void (*c_printinfo)(struct C_person *c_per);//結構體內不能有函數成員,使用函數指針實現
};
void c_printinfo(struct C_person *c_per)
{
printf("name=%s age=%d work=%s\n",c_per->name,c_per->age,c_per->work);
}
//C++
using namespace std;
class Person
{
public:
char *name;
int age;
char *work;
void cpp_printinfo() //類中可以有函數成員
{
cout << "name=" <<name<<" age="<<age <<" work="<<work << endl;
}
};
int main(int argc,char **argv)
{
//C
struct C_person c_per={"c",16,"language",c_printinfo};//可以看到C語言的結構體還是具有一定的侷限性,沒有CPP的類靈活
c_per.c_printinfo(&c_per);
//C++
Person cpp_per={"cpp",10,"language"};//Person是類 cpp_per是Person的對象
cpp_per.cpp_printinfo();
return 0;
}
結果
2.類的訪問控制
類成員的訪問權限有三個關鍵字控制 public private protected
private 值提供類內部函數的使用
public類外的程序可以使用
protected先不說
實例1:全爲pubilc
#include <iostream>
#include <stdio.h>
/*
day1:類的引入
例子:輸出人名,年齡,職業
c++:使用類的方式輸出
目的:瞭解public 和private 的使用
*/
//C++
using namespace std;
class Person //類成員全是public
{
public:
char *name;
int age;
char *work;
public:
void cpp_printinfo() //類中可以有函數成員
{
cout << "name=" <<name<<" age="<<age <<" work="<<work << endl;
}
};
int main(int argc,char **argv)
{
//C++
Person cpp_per={"cpp",10,"language"};
cpp_per.cpp_printinfo();
return 0;
}
運行結果 正確
示例二 數據成員是private 函數成員是public
#include <iostream>
#include <stdio.h>
/*
day1:類的引入
例子:輸出人名,年齡,職業
c++:使用類的方式輸出
目的:瞭解public 和private 的使用
*/
//C++
using namespace std;
class Person //類成員全是public
{
private:
char *name;
int age;
char *work;
public:
void cpp_printinfo() //類中可以有函數成員
{
cout << "name=" <<name<<" age="<<age <<" work="<<work << endl;
}
};
int main(int argc,char **argv)
{
//C++
Person cpp_per={"cpp",10,"language"};
cpp_per.cpp_printinfo();
return 0;
}
編譯報錯
修改示例二,在public下增加修改數據成員函數setname() setage() setwork()
#include <iostream>
#include <stdio.h>
/*
day1:類的引入
例子:輸出人名,年齡,職業
c++:使用類的方式輸出
目的:瞭解public 和private 的使用
*/
//C++
using namespace std;
class Person //類成員全是public
{
private:
char *name;
int age;
char *work;
public:
void setname(char *n)
{
name=n;
}
void setage(int a)
{
age=a;
}
void setwork(char *w)
{
work=w;
}
void cpp_printinfo() //類中可以有函數成員
{
cout << "name=" <<name<<" age="<<age <<" work="<<work << endl;
}
};
int main(int argc,char **argv)
{
//C++
Person cpp_per;
// cpp_per.name="CPP"; 在類的外部訪問私有成員報錯
cpp_per.setname("CPP");
cpp_per.setage(16);
cpp_per.setwork("language");
cpp_per.cpp_printinfo();
return 0;
}
運行結果
三個修改函數都重新申明瞭一個形參,我們可不可以直接用name age work呢?
如下
void setname(char *name)
{
name=name;//這樣是沒有意義的 雖然不報錯,但是輸出結果亂碼
}
我們可以用this指針來解決這個問題,每個類都默認有一個this指針指向自己
void setname(char *name)
{
this->name=name;///給人的感覺就是當前使用的對象的name等於這個形參的值,兩個是不一樣的
}
運行結果正確
在類寫成員函數看起來非常臃腫,我們將函數聲明寫在類中,函數實現寫在外面用Person::函數名()表示這個函數屬於這個類
class Person //類成員全是public
{
private:
char *name;
int age;
char *work;
public:
void setname(char *name);
void setage(int age);
void setwork(char *work);
void cpp_printinfo(); //類中可以有函數成員
};
void Person::setname(char *name)
{
this->name=name;//給人的感覺就是當前使用的對象的name等於這個形參的值,兩個是不一樣的
}
void Person::setage(int age)
{
this->age=age;
}
void Person::setwork(char *work)
{
this->work=work;
}
void Person::cpp_printinfo() //類中可以有函數成員
{
cout << "name=" <<name<<" age="<<age <<" work="<<work << endl;
}