zoukankan      html  css  js  c++  java
  • 【1】关于类的知识点有哪些

    理解类从以下几个方面:

    (1)类(class)实际上是对某种类型的对象定义属性和方法的原型。

    它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。

    那么抽象怎么理解?比如,“水果”这个词就很抽象,“人民”这个词也很抽象,“动物”这个词同样抽象。咋这么说呢?

    你试着想想:有人让你去给她买二斤水果,你肯定要问买什么水果,到底是苹果?香蕉?梨?桔子?......... 你说它叫得多抽象呀~

    (2)类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的属性和方法。实际上它本身并不是对象,因为它不存在于内存中。

    也就是说:实实在在是不存在它这样的一个实物的!当使用类的代码运行时,内存中会创建类的一个实例,即对象。

    虽然只有一个类,但能由这个类在内存中创建多个相同类型的对象,只是彼此属性不同,而方法或者说事件是完全相同的。

    (3)属性是区别彼此的变量集;方法是此类对象共有的一种能力或者说功能的函数。

    (4)可以把类看作“理论上”的对象,也就是说,它为对象提供蓝图 ,但在内存中并不存在。

    从这个蓝图可以创建任何数量的对象。从类创建的所有对象都有相同的成员:属性、方法和事件。

    但是,每个对象都像一个独立的实体一样。例如,一个对象的属性可以设置成与同类型的其它对象完全不同的值。

    (5)类的定义形式 

    示例代码如下:

    类的定义由类头 和 类体 两部分组成。

    类头由关键字Class 开头,然后是类名,其命名规则与一般标识符的命名规则一致。

    类体包括所有的细节,并放在一对花括号中。

    类的定义也是一个语句,所以要以分号结尾,否则会产生编译错误。

    (6)类体分为两种成员

    <1>类的数据成员,即就是属性变量

    <2>类的成员函数,即就是功能方法

    (7)类中成员的有三种访问权限

    <1> private:私有的

    该类成员只可以被该类的成员函数访问

    <2> public: 公有的

    该类成员可以在类外访问

    <3> protected: 受保护的

    该类成员只能被此类的成员函数或派生类的成员函数访问

    (8)类的定义和使用注意点

    <1> 在类的定义中,不能对数据成员进行初始化

    <2> 类的所有成员都有访问属性,即使没有标注的情况下,系统默认是私有的【class关键字的前提下】

    <3> 一般将数据成员定义为私有成员或者保护成员,而将成员函数定义为共有成员

    <4> 类中的数据成员可以是C++语法中的任意类型,但是不能用存储类型auto,register或者extern修饰

    <5> 一个类的成员可以是其他类的对象,但是不能以类自身的对象作为类的成员,而类自身的指针或引用可以作为类的成员

    <6> 在C语言中,结构只有数据成员。

    在C++中struct关键字也可以定义类,与class的最大区别是其成员默认的属性为public,而class成员的默认属性是private

    <7> 每个类都定义了自己的新作用域和唯一的类型

    <8> 类的定义以分号结束。一则:整个定义是一个完整的语句;二则:其后可以直接接一个对象列表

    <9> 成员函数定义在类的内部,相当于内联函数;如果定义在类的外部,需要实现内联函数,必须要显式加入inline关键字

    <10> 类的外部定义成员函数形式如下:类名::函数名(){.......}

    (9)类的定义数据成员示例代码如下:

     1 class Test
     2 {
     3     private:
     4     int value;                    //一般数据成员
     5     static int num;               //静态成员(类外初始化)
     6     const int max;                //常量成员(参数列表初始化)
     7     static const int min;         //静态常量(类外初始化)
     8     int &b;                          //一般引用(参数列表)
     9     int *p;                          //一般指针成员
    10     //Test t1;                     //error!!!!      自身对象(无限递归)
    11     static Test  t;                //自身静态对象
    12     Test &t2;                      //自身引用
    13     Test *t3;                      //自身指针
    14 };

    (10)由类定义分析类创建对象占用内存大小

    关于类占用的内存大小问题,是每个程序员值得慎重考虑的。

    那么在平时的学习中,我们就应该有这方面的意识。

    下面仅仅就自己的总结分析一部分,因为暂不牵涉内存对齐的情况。

    示例代码如下:

      1 #include<iostream>
      2 using namespace std;
      3 
      4 class A
      5 {};
      6 // 空类,因为(为什么?请参见随笔《类的认识》)编译器会用一个字节标记这个类,所以大小为1
      7 
      8 class B : public A
      9 {};
     10 // B继承于A,但同样也是空类,大小仍为1
     11 
     12 class C : virtual public A
     13 {};
     14 // C虚继承于A,编译器会为其添加一个指向基类的指针,所以大小变为4
     15 
     16 class D
     17 {
     18 public:
     19     int a;
     20     static int b; // 静态变量被放在静态存储区
     21 };
     22 // 静态变量存储位置不同不占用类的内存空间,所以大小为4
     23 
     24 class E
     25 {
     26 public:
     27     void print() { cout << "E" << endl; }
     28 
     29 private:
     30     int a;
     31 };
     32 // 成员函数不占类的内存空间,所以大小仍为4
     33 
     34 class F
     35 {
     36 public:
     37     int a;
     38     const int  b; // 常量成员(参数列表初始化)
     39     F() : a(1), b(2)
     40     {}
     41 };
     42 // 常量成员占用类的内存空间,所以大小为8
     43 
     44 class G
     45 {
     46 public:
     47     int a;
     48     static const int  b; //静态常量成员(类外初始化)
     49 };
     50 const int G::b = 10;
     51 // 静态常量成员存储位置不同,不占用类的内存空间,所以大小为4
     52 
     53 class H
     54 {
     55 public:
     56     int a;
     57     int &b; // 引用变量成员(参数列表初始化)
     58     H() : a(1), b(a)
     59     {}
     60 };
     61 // 引用变量成员占用类的内存空间,所以大小为8
     62 
     63 class I
     64 {
     65 public:
     66     int a;
     67     static I b;
     68 };
     69 // 自身静态成员对象(即静态变量,同类D)不占用类的内存空间,所以大小为4
     70 
     71 class J
     72 {
     73 public:
     74     int a;
     75     J *p;
     76 };
     77 // 自身指针变量占用类的内存空间,所以大小为8
     78 
     79 class K
     80 {
     81     int a;
     82 
     83 public:
     84     static void Fun()
     85     {
     86         cout << "Fun" << endl;
     87     }
     88 };
     89 // 类的静态成员函数也不占用类的内存空间,所以大小为4
     90 
     91 class L
     92 {
     93 public:
     94     virtual void print() { cout << "F" << endl; }
     95 
     96 private:
     97     int a;
     98 };
     99 // 一旦有虚函数就会多一个虚表指针,系统需要用这个指针维护虚函数表。所以大小为8
    100 
    101 class M : public L
    102 {
    103 public:
    104     int b;
    105     virtual void print() { cout << "G" << endl; }
    106     virtual void print2() { cout << "G2" << endl; }
    107 };
    108 // 至于多几个虚函数不会影响内存大小变化。可见一个类只有一个虚函数指针。大小为12
    109 
    110 void main()
    111 {
    112     A  a;
    113     B  b;
    114     C  c;
    115     D  d;
    116     E  e;
    117     F  f;
    118     G  g;
    119     H  h;
    120     I  i;
    121     J  j;
    122     K  k;
    123     L  l;
    124     M  m;
    125     cout << "A:" << sizeof(A) << " " << sizeof(a) << endl;      //1 1
    126     cout << "B:" << sizeof(B) << " " << sizeof(b) << endl;      //1 1
    127     cout << "C:" << sizeof(C) << " " << sizeof(c) << endl;      //4 4
    128     cout << "D:" << sizeof(D) << " " << sizeof(d) << endl;      //4 4
    129     cout << "E:" << sizeof(E) << " " << sizeof(e) << endl;      //4 4
    130     cout << "F:" << sizeof(F) << " " << sizeof(f) << endl;      //8 8
    131     cout << "G:" << sizeof(G) << " " << sizeof(g) << endl;      //4 4
    132     cout << "H:" << sizeof(H) << " " << sizeof(h) << endl;      //8 8
    133     cout << "I:" << sizeof(I) << " " << sizeof(i) << endl;      //4 4
    134     cout << "J:" << sizeof(J) << " " << sizeof(j) << endl;      //8 8
    135     cout << "K:" << sizeof(K) << " " << sizeof(k) << endl;      //4 4
    136     cout << "L:" << sizeof(L) << " " << sizeof(l) << endl;      //8 8
    137     cout << "M:" << sizeof(M) << " " << sizeof(m) << endl;      //12 12
    138 
    139     system("pause");
    140 }

    希望有所收获。

     

    作者:kaizen
    声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
    签名:顺序 选择 循环
  • 相关阅读:
    99乘法表的几种实现方法
    log4net使用(包括单个文件和按日期生成多个文件)
    c# 压缩文件
    寻找Windows下MySQL的错误日志
    MySQL 索引
    java hashCode 作用
    springMVC swagger2
    ConcurrentHashMap原理分析(1.7与1.8)
    国产烂片深度揭秘
    Practice| 类型转换| 逻辑运算
  • 原文地址:https://www.cnblogs.com/Braveliu/p/2841589.html
Copyright © 2011-2022 走看看