网站建设行业论坛,wordpress 下载远程图片大小,东京购物商城,怎么做网页htmlC 在 C 语言的基础上增加了面向对象编程#xff0c;C 支持面向对象程序设计。类是 C 的核心特性#xff0c;通常被称为用户定义的类型。类用于指定对象的形式#xff0c;它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成…C 在 C 语言的基础上增加了面向对象编程C 支持面向对象程序设计。类是 C 的核心特性通常被称为用户定义的类型。类用于指定对象的形式它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。关于C中this指针的理解当你进入一个房子后你可以看到房子内的桌子、椅子、地板等但是你看不到房子的全貌对于类来说你可以看到成员函数、成员变量但你看不到实例本身但是应用this可以让我们看到这个实例本身。我的理解class类就好比这座房子this就好比一把钥匙通过钥匙来打开了这座房子的门那么里面的东西就随意你取用了。因为this作用域是在类的内部自己声明一个类的时候还不知道实例化对象的名字所以用this来使用对象变量的自身。在非静态成员函数中编译器在编译的时候加上this作为隐含形参通过this来访问各个成员即使你没有写上this指针代码实例class Point
{ int x, y;public:Point(int a, int b) { xa; yb;}void MovePoint( int a, int b){ xa; yb;}void print(){ coutx }void main( ){Point point1( 10,10);point1.MovePoint(2,2);point1.print( );}
}C 中的 struct 对 C 中的 struct 进行了扩充它已经不再只是一个包含不同数据类型的数据结构了它已经获取了太多的功能。struct 能包含成员函数吗 能struct 能继承吗 能struct 能实现多态吗 能既然这些它都能实现那它和 class 还能有什么区别最本质的一个区别就是默认的访问控制体现在两个方面1默认的继承访问权限。struct是public的class是private的。你可以写如下的代码struct A
{char a;
};
struct B : A
{char b;
};这个时候 B 是 public 继承 A 的。如果都将上面的 struct 改成 class那么 B 是 private 继承 A 的。这就是默认的继承访问权限。所以我们在平时写类继承的时候通常会这样写struct B : public A就是为了指明是 public 继承而不是用默认的 private 继承。当然到底默认是 public 继承还是 private 继承取决于子类而不是基类。我的意思是struct 可以继承 class同样 class 也可以继承 struct那么默认的继承访问权限是看子类到底是用的 struct 还是 class。如下struct A{};
class B : A{}; //private继承
struct C : B{}; //public继承2struct 作为数据结构的实现体它默认的数据访问控制是 public 的而 class 作为对象的实现体它默认的成员变量访问控制是 private 的。注意我上面的用词我依旧强调 struct 是一种数据结构的实现体虽然它是可以像 class 一样的用。我依旧将 struct 里的变量叫数据class 内的变量叫成员虽然它们并无区别。其实到底是用 struct 还是 class完全看个人的喜好你可以将你程序里所有的 class 全部替换成 struct它依旧可以很正常的运行。但我给出的最好建议还是当你觉得你要做的更像是一种数据结构的话那么用 struct如果你要做的更像是一种对象的话那么用 class。当然我在这里还要强调一点的就是对于访问控制应该在程序里明确的指出而不是依靠默认这是一个良好的习惯也让你的代码更具可读性。说到这里很多了解的人或许都认为这个话题可以结束了因为他们知道 struct 和 class 的“唯一”区别就是访问控制。很多文献上也确实只提到这一个区别。但我上面却没有用“唯一”而是说的“最本质”那是因为它们确实还有另一个区别虽然那个区别我们平时可能很少涉及。那就是“class” 这个关键字还用于定义模板参数就像 “typename”。但关键字 “struct” 不用于定义模板参数。这一点在 Stanley B.Lippman 写的 Inside the C Object Model 有过说明。问题讨论到这里基本上应该可以结束了。但有人曾说过他还发现过其他的“区别”那么让我们来看看这到底是不是又一个区别。还是上面所说的C 中的 struct 是对 C 中的 struct 的扩充既然是扩充那么它就要兼容过去 C 中 struct 应有的所有特性。例如你可以这样写struct A //定义一个struct
{char c1;int n2;double db3;
};
A a{p,7,3.1415926}; //定义时直接赋值也就是说 struct 可以在定义的时候用 {} 赋初值。那么问题来了class 行不行呢将上面的 struct 改成 class试试看。报错噢~于是那人跳出来说他又找到了一个区别。我们仔细看看这真的又是一个区别吗你试着向上面的 struct 中加入一个构造函数或虚函数你会发现什么对struct 也不能用 {} 赋初值了。的确以 {} 的方式来赋初值只是用一个初始化列表来对数据进行按顺序的初始化如上面如果写成 A a{p,7}; 则 c1,n2 被初始化而 db3 没有。这样简单的 copy 操作只能发生在简单的数据结构上而不应该放在对象上。加入一个构造函数或是一个虚函数会使 struct 更体现出一种对象的特性而使此{}操作不再有效。事实上是因为加入这样的函数使得类的内部结构发生了变化。而加入一个普通的成员函数呢你会发现{}依旧可用。其实你可以将普通的函数理解成对数据结构的一种算法这并不打破它数据结构的特性。那么看到这里我们发现即使是 struct 想用 {} 来赋初值它也必须满足很多的约束条件这些条件实际上就是让 struct 更体现出一种数据机构而不是类的特性。那为什么我们在上面仅仅将 struct 改成 class{} 就不能用了呢其实问题恰巧是我们之前所讲的——访问控制你看看我们忘记了什么对将 struct 改成 class 的时候访问控制由 public 变为 private 了那当然就不能用 {} 来赋初值了。加上一个 public你会发现class 也是能用 {} 的和 struct 毫无区别做个总结从上面的区别我们可以看出struct 更适合看成是一个数据结构的实现体class 更适合看成是一个对象的实现体。