C++ 赎罪之路

实践目标:   1.c++ 类的定义

      2.数据变量的定义

      3.成员函数的声明以及定义

实例: 平年闰年的判断:

(相关注意点都在程序的注释当中)

 1 #include <iostream>
 2     using namespace std;
 3     
 4     /*
 5         类的数据变量,以及类的成员函数的申明
 6     */
 7     class TDate {
 8         public:
 9             void SetDate(int y, int m, int d);
10             int isLeapYear();
11             void Print();
12         private:
13             int year,day,month;
14     };  //类定义完成后加分号
15 
16     /*
17         定义类的成员函数,且必须在程序中实现
18     */
19     void TDate :: SetDate(int y, int m, int d) {
20         year = y ;
21         month = m ;
22         day = d ;
23     }
24 
25     int TDate :: isLeapYear() {
26         return (year%4==0 && year%100 != 0) || (year%400 == 0);
27     }
28     void TDate :: Print() {
29         cout<<year<<"."<<month<<"."<<day<<endl ;
30     }
31     
32     int main(){
33         TDate td1 ;
34         td1.SetDate(2009,5,10);
35         int flag = td1.isLeapYear();
36         td1.Print();
37         if(flag == 1)
38             cout<<"是闰年"<<endl ;
39          else 
40             cout<<"是平年!"<<endl ;
41         return 0;
42     }
View Code

8月29日晚上

饭后看了几个知识点,总结下(倒序):

点击http://www.runoob.com/cplusplus/cpp-class-access-modifiers.html看一下继承的权限问题,讲的比较清楚!

1. 派生类:单一继承、多继承、权限问题、消除二义性、作用域分辨、

 1 /*
 2 *    派生类:(java中类的继承)
 3 */
 4 #include <iostream>
 5 using namespace std;
 6 
 7 //默认为private A
 8 class A {
 9     private:
10         int a;
11     public:
12         A(int a){cout<<"this is A.a = "<<a<<endl;}
13         ~A(){cout<<"dele A"<<endl;}
14 };
15 
16 class B {
17     private:
18         int y ;
19     public:
20         B(int y) {cout<<"this is B.y = "<<y<<endl;}
21         ~B() {cout<<"dele B"<<endl;}
22 };
23 
24 /*
25 *    C 类继承A and B
26 *    格式: class 派生类名 : 访问控制 基类名 {访问控制:成员声明列表};
27 *    多继承:class 派生类名 : 访问控制 基类名, 访问控制 基类名, ...{...};
28 */
29 class C :public A,public B {
30     private:
31         int c ;
32     public:
33         //构造函数初始化列表 java:C(){super.A()}
34         C(int c, int x, int y):A(x),B(y) {
35             cout<<"this is C.c = "<<c<<endl;
36         }
37     
38         //析构函数
39         ~C() {cout<<"dele C"<<endl;}
40 };
41 
42 int main() {
43     C c1(1, 2, 3);
44     return 0;
45 }
View Code

权限、二义性、作用域分辨相关示例代码:

 1 /*
 2 *    派生类:(java中类的继承)
 3 */
 4 #include <iostream>
 5 using namespace std;
 6 
 7 //默认为private A
 8 class A {
 9     private:
10         int a;
11     public:
12         A(int a){cout<<"this is A.a = "<<a<<endl;}
13         ~A(){cout<<"dele A"<<endl;}
14         
15         void getA() {
16             cout<<"getA()"<<endl;
17         }
18 };
19 
20 class B {
21     private:
22         int y ;
23     public:
24         B(int y) {cout<<"this is B.y = "<<y<<endl;}
25         ~B() {cout<<"dele B"<<endl;}
26         
27         void getB(){
28             cout<<"getB()"<<endl;
29         }
30 };
31 
32 /*
33 *    C 类继承A and B
34 *    格式: class 派生类名 : 访问控制 基类名 {访问控制:成员声明列表};
35 *    多继承:class 派生类名 : 访问控制 基类名, 访问控制 基类名, ...{...};
36 */
37 class C :public A,public B {
38     private:
39         int c ;
40     public:
41         //构造函数初始化列表 java:C(){super.A()}
42         C(int c, int x, int y):A(x),B(y) {
43             cout<<"this is C.c = "<<c<<endl;
44         }
45     
46         //析构函数
47         ~C() {cout<<"dele C"<<endl;}
48     
49         void getC() {
50             cout<<"getC()"<<endl;
51         }
52         void getB() {
53             B::getB(); //作用域分辨
54         }
55 };
56 
57 int main() {
58     C c1(1, 2, 3);
59     cout<<endl<<endl;
60     c1.getA();
61     cout<<"error:c1.getB()"<<endl;
62     
63     /*
64     *    消除二义性,使程序能够找到名字相同的成员函数不同作用域的实现
65     */
66     c1.getB();
67     c1.getC();
68     c1.B::getB(); //当继承B为private时 该句为错误,其他都能正常运行
69     return 0;
70 }
71 -----------------------------------------------------------------------------
72 运行结果:
73 this is A.a = 2
74 this is B.y = 3
75 this is C.c = 1
76 
77 
78 getA()
79 error:c1.getB()
80 getB()
81 getC()
82 getB()
83 dele C
84 dele B
85 dele A
demo

2. 静态成员(比较好理解,和可以借助java的静态成员作为理解,毕竟java是儿子)


9月3号 早上

指针:是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

 

例子2:

在指针中值得注意的是:可以进行比较;(感觉像是在地址进行再比较,其实是地址上的值进行比较,和java上的有些区别)

其他的运算时按照地址上的值进行运算的,都是通过指针的自增或自减实现指针向前、向后移动找到位置上的值来实现运算。

#include <iostream>

using namespace std;
const int MAX = 3;

int main ()
{
   int  var[MAX] = {10, 100, 200};
   int  *ptr;

   // 指针中第一个元素的地址
   ptr = var;
   int i = 0;
   while ( ptr <= &var[MAX - 1] )
   {
      cout << "Address of var[" << i << "] = ";
      cout << ptr << endl;

      cout << "Value of var[" << i << "] = ";
      cout << *ptr << endl;

      // 指向上一个位置
      ptr++;
      i++;
   }
   return 0;
}


--------------------------------------------------------------------------执行结果:
Address of var[0] = 0xbfce42d0
Value of var[0] = 10
Address of var[1] = 0xbfce42d4
Value of var[1] = 100
Address of var[2] = 0xbfce42d8
Value of var[2] = 200
View Code

 多态:基类指向子类的方法,子类重写基类的方法。

#include <iostream> 
using namespace std;
 
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
     virtual int area()  //virtual修饰后能够动态的绑定到子类的方法
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};
class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};
class Triangle: public Shape{
   public:
      Triangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// 程序的主函数
int main( )
{
   Shape *shape;                  
   Rectangle rec(10,7);
   Triangle  tri(10,5);
 
   // 存储矩形的地址
   shape = &rec;                  // Shape shape = new Rectangle();
   // 调用矩形的求面积函数 area
   shape->area();               //shape.area();
 
   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}    
View Code

c++的数据封装

所谓的数据封装就是一个类的属性私有化,然后通过公共的方法(接口)让其对象进行调用,达到对属性的操作的目的;

接口(抽象类):

#include <iostream>
 
using namespace std;
 
// 基类
class Shape 
{
public:
   // 提供接口框架的纯虚函数
   virtual int getArea() = 0;
   void setWidth(int w)
   {
      width = w;
   }
   void setHeight(int h)
   {
      height = h;
   }
protected:
   int width;
   int height;
};
 
// 派生类
class Rectangle: public Shape
{
public:
   int getArea()
   { 
      return (width * height); 
   }
};
class Triangle: public Shape
{
public:
   int getArea()
   { 
      return (width * height)/2; 
   }
};
 
int main(void)
{
   Rectangle Rect;
   Triangle  Tri;
 
   Rect.setWidth(5);
   Rect.setHeight(7);
   // 输出对象的面积
   cout << "Total Rectangle area: " << Rect.getArea() << endl;
 
   Tri.setWidth(5);
   Tri.setHeight(7);
   // 输出对象的面积
   cout << "Total Triangle area: " << Tri.getArea() << endl; 
 
   return 0;
}
--------------------------------------------------------------------------
运行结果:
Total Rectangle area: 35
Total Triangle area: 17
注意:在c++中没有重写的概念,只能是重载;接口就是一个公共的方法,但是是一个纯虚函数
View Code

 

posted @ 2017-08-29 15:04  Zero豪  阅读(240)  评论(0编辑  收藏  举报