C++基础04-类基础
生活随笔
收集整理的這篇文章主要介紹了
C++基础04-类基础
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?一、類和對象
面向對象三大特點:封裝、繼承、多態。
struct 中所有行為和屬性都是 public 的(默認)。C++中的 class 可以指定行為和屬性的訪問方式。
封裝,可以達到,對內開放數據,對外屏蔽數據,對外提供接口。達到了信息隱蔽的功能。
class 封裝的本質,在于將數據和行為,綁定在一起然后能過對象來完成操作?。
#if 1 #define _CRT_SECURE_NO_WARNINGS #include <iostream>using namespace std;struct Hero {char name[64];int sex; };void printHero(struct Hero &h) {cout << "Hero" << endl;cout << "name = " << h.name << endl;cout << "sex = " << h.sex << endl; }class AdvHero { public://訪問控制權限char name[64];int sex;void printHero(){cout << "advHero" << endl;cout << "name = " << name << endl;cout << "sex = " << sex << endl;} };void test01() {Hero h;strcpy(h.name, "gailun");h.sex = 1;printHero(h);AdvHero advH;strcpy(advH.name, "ChunBro");advH.sex = 1;advH.printHero(); }class Animal {//{}以內 叫類的內部, 以外叫類的外部 public:char kind[64];char color[64];//在public下面定義成員變量和函數 是能夠在類的內部和外部都可以訪問的。void printAnimal(){cout << "kind = " << kind << endl;cout << "color = " << color << endl;}void write(){cout << kind << "開始鞋子了" << endl;}void run(){cout << kind << "跑起來了" << endl;}// private://在private下面定義的成員變量和方法只能夠在類的內部訪問}; void test02() {Animal dog;strcpy(dog.kind, "dog");strcpy(dog.color, "yellow");Animal sheep;strcpy(sheep.kind, "sheep");strcpy(sheep.color, "white");dog.write();sheep.run(); } int main(void) {test01();cout << "-----------" << endl;test02();return 0; } #endif二、類的封裝
#if 1 #define _CRT_SECURE_NO_WARNINGS #include <iostream>//struct using namespace std; struct Date {int year;int month;int day; };void init_date(struct Date & d) {cout << "year, month, day" << endl;cin >> d.year;cin >> d.month;cin >> d.day; }//打印data的接口 void print_date(struct Date &d) {cout << d.year << "年" << d.month << "月" << d.day << "日" << endl; }//是不是閏年 bool is_leap_year(struct Date &d) {if (((d.year % 4 == 0) && (d.year % 100 != 0)) || (d.year % 400 == 0)) {return true;}return false; } void test01() {Date d1;init_date(d1);print_date(d1);if (is_leap_year(d1) == true) {cout << "是閏年 " << endl;}else {cout << "不是閏年 " << endl;} }//類 class MyDate { public://成員方法 成員函數void init_date(){cout << "year, month, day" << endl;cin >> year;cin >> month;cin >> day;}//打印data的接口void print_date(){cout << year << "年" << month << "月" << day << "日" << endl;}bool is_leap_year(){if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {return true;}return false;}int get_year(){return year;}void set_year(int new_year){year = new_year;}protected://保護控制權限。在單個類中,跟private是一抹一樣。//在類的繼承中跟private有區別, private:int year;int month;int day; };void test02(){MyDate my_date;my_date.init_date();my_date.print_date();if (my_date.is_leap_year() == true){cout << "是閏年 " << endl;}else {cout << "不是閏年 " << endl;}//getter,settercout << my_date.get_year() << endl;my_date.set_year(2000);cout << my_date.get_year() << endl; }//一個類類的內部,默認的訪問控制權限是private class Hero {int year; };//一個結構體默認的訪問控制權限的是public struct Hero2 {int year;void print(){} };void test03() {Hero h;//h.year = 1000; 報錯Hero2 h2;h2.year = 100; } int main(void) {//test01();test02();test03();return 0; } #endif三、面向過程和面向對象
#if 0 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Dog { public:void eat(char *food){cout << name << "吃" << food << endl;}char name[64]; };//面向過程 void eat(class Dog &dog, char *food) {cout << dog.name << "吃" << food << endl; }int main(void) {Dog dog;strcpy(dog.name, "狗");//過程驅動eat(dog, "翔");//對象驅動dog.eat("翔");return 0; } #endif練習:
#if 1 #define _CRT_SECURE_NO_WARNINGS #define PI 3.14 #include <iostream> using namespace std;//面向過程 double get_l(double r) {return 2 * PI*r; } double get_s(double r) {return PI*r*r; } void test01() {cout << "面向過程" << endl;double r = 2;cout << "周長為:" << get_l(r) << endl;cout << "面積為:" << get_s(r) << endl; }//面向對象 class Circle { public:Circle() {}Circle(double r) :m_r(r) {}void setR(double r) {m_r = r;}double get_l() {return 2 * PI*m_r;}double get_s() {return PI*m_r*m_r;} public:double m_r; //我 double m_r; }; void test02() {cout << "面向對象" << endl;Circle c1(2);cout << "周長為:" << c1.get_l() << endl;cout << "面積為:" << c1.get_s() << endl;Circle c2;c2.setR(4);cout << "周長為:" << c2.get_l() << endl;cout << "面積為:" << c2.get_s() << endl;} class Circle2 { public:void setR(double r) {m_r = r;}double get_l() {return m_l;}double get_s() {return m_s;} private:double m_r;double m_l= 2 * PI*m_r; //其實為2*3.14*隨機數 錯誤double m_s= PI*m_r*m_r; //其實為3.14*隨機數*隨機數 錯誤 }; void test03() {Circle2 c1;c1.setR(10);cout << c1.get_l() << endl; //-5.81274e+62cout << c1.get_s() << endl; //2.69013e+124 } class Circle3 { public:void setR(double r) {m_r = r;}double get_l() {return 2 * PI*m_r;}double get_s() {return PI*m_r*m_r;} private:double m_r;double m_l ; //其實為2*3.14*隨機數 錯誤double m_s ; //其實為3.14*隨機數*隨機數 錯誤 }; void test04() {Circle3 c1;c1.setR(10);cout << c1.get_l() << endl; //62.8cout << c1.get_s() << endl; //314 } int main() {test01();test02();cout << "-------------" << endl;test03();cout << "-------------" << endl;test04();return 0; } #endif // demo02_circle_err.cpp #include<iostream> using namespace std;//c++的命名空間 class circle { public: double r; double pi = 3.1415926; double area = pi*r*r; }; int main(void) { circle pi; cout<<"請輸?area"<< endl; cin >>pi.r; cout<<pi.area<<endl; //亂碼 return 0; }運行結果:?
#include "iostream" #define PI 3.1415926 using namespace std; class Cricle { public:double m_r;double m_s; public:void setR(double r) {m_r = r;}double getR(){return m_r;}double getS(){m_s = m_r*m_r*PI;return m_s;} }; int main() {double r1;Cricle c1;cout << "請輸入圓的半徑" << endl;cin >> r1;c1.setR(r1);cout << "圓的面積為:" << c1.getS() << endl;return 0; }運行結果:
不難發現有成員函數和沒有成員函數答案是不一樣的,為什么沒有成員函數的答案會是一個亂碼?
畫個圖來理解一下。
?
當給r賦值并不會影響area的值,因為當實例化類對象時,就已經為類對象的數據成員分配了空間。給r賦值,并不會影響area中初始化時的r的隨機值。相互獨立。
所以沒有成員函數和有成員函數的相差很大。
參考自https://blog.csdn.net/sum_TW/article/details/52108421
?
?
總結
以上是生活随笔為你收集整理的C++基础04-类基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++基础03-C++对c的拓展-函数
- 下一篇: C++基础15-类和对象之多态