都是C++的类惹得祸!

hjjdebug 2009-04-13 05:20:52
author: hjjdebug
time: 2009-4-13
从c 到c++, 最主要是引入了类,并由此引入了其它许多概念。

函数的默认参数,类的构造和析构函数
公有,私有成员变量,成员函数,友员函数
运算符重载。
模板类,模板类套模板类。 等等。

这些概念纠缠在一起常使人头晕脑涨, c++的类怎么了,到底是什么东西?它想干什么?
我们怎么理解?
下面给出一个简单例子,程序本身什么也没干,但包含了所有上面的感念。
慢慢的调试它,理解它。还有许多概念没有包括,以后再说吧。
菜鸟文章,高手飘过,新手帮顶。欢迎拍砖!
; ---------------------------------------------------------------------------
#include <iostream>
using namespace std;

template <class T> class T1Class
{
public:
T1Class(){};
T1Class(T a1):_a1(a1+0x20){};
T1Class(T& a1){
_a1=a1._a1;
};
~T1Class(){};
friend ostream& operator<<(ostream &os,T1Class& a1)
{
os<<a1._a1<<endl;
return os;
};
private:
T _a1;
};
template <class TA, class TB=T1Class <TA> > class T2Class
{
public:
TA _aa;
TB _ab;
T2Class(){};
T2Class(TA a1, T1Class<char>& a2=T1Class<char>('Z')){
_aa=a1;
_ab=a2;
};
~T2Class(){};
};
int main(int argc, char *argv[])
{
// string str("hello");
//cout<<str;
T2Class<char> aObj('a');
cout<<aObj._aa<<ends<<aObj._ab<<endl;
system("pause");
return 0;
}
; ---------------------------------------------------------------------------
...全文
250 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2009-04-14
  • 打赏
  • 举报
回复
哇,摆擂!
lz好是雄辩啊,说的不错,
攒一个!!
hoomien 2009-04-14
  • 打赏
  • 举报
回复
写得还可以!
hjjdebug 2009-04-14
  • 打赏
  • 举报
回复
谢谢楼上所有兄弟。本来讨论刚开了个头,后面还有续篇,想想也没啥意思。不和大家口味。或者是投错了地方。
我又何必自讨苦吃,就此打住吧。
hjjdebug 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Jinhao 的回复:]
lz是喜剧演员?

>>话说cout, 它是ostream类创建的一个对象,它的功能就是抽取

有些术语用法有点错误,但是整个故事还是不错的。哈哈
[/Quote]
语言是表达问题的形式,但这里更重要的是技术内涵。这个是技术贴,是深度探索c++思想。
所以有问题一定要提出。技术问题分两种,一种是表达问题,一种是思想问题。但无论哪一种,
指明对方问题都是施教于人,是会受到尊重的。否则我还一直蒙在鼓里,不知所云。
hjjdebug 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 li_il 的回复:]
累什么累啊?有多累?
都是语法,class,语法,没什么好理解的。

ADT,抽象数据类型,C++比C强一点点,就强在这里。

ADT,数据和操作的组合。用于描述世界。

继承,重载,多态,私有公有。。。。都骗人的,想都不用想,不重要,附加值太低。

类关系,有一,是一,用一。等等。思想!!非常重要。

函数调用,模板变换,不重要。

面向对象思想!极其重要,靠他吃饭呀。



[/Quote]
Mr Li_il 先生看来是快人快语。
不过类是对象的模板,对象是类的实例,二者本是一体,缘何蔑视类而推崇对象?
另外汇编,C,perl,bash都不谈"对象", 所以都不靠"对象”吃饭,靠自己吃饭。
hjjdebug 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Jinhao 的回复:]

有些术语用法有点错误,但是整个故事还是不错的。哈哈
[/Quote]
哦!是吗,路过的高手不要吝啬指教啊! 有错必改!
又写了一段,发上来供大家指教。

刚赞完了c++的多态。觉的意犹未尽。
类当时没有这种能力,事后还能添加能力,你是否觉的很美呢?

再来说一说c++的构造函数。
有人问,对象都是通过构造函数创建吗?
答曰:是的。
类是一个模板,或者说是一个钢戳,它能够在内存中刻画出一个个类似的对象。
这个刻画的过程,就是构造函数。

再问: 那这些个对象都身存何处呢?
它们可能存于栈中,也可能存于堆中,或者部分存于栈,部分存于堆。

问3:对象都是动态创建的吗?在数据区可以创建对象吗?
答3,是的,对象都是动态创建的,正好比对象都是通过构造函数创建的。你可以在数据区创建对象。
例如你声明全局数据对象。这些全局对象是在main函数运行之前由_cinit函数最终调用类构造函数创建的。
所以位于数据区的全局对象,在文件中储存的是0,在运行时在main之前在数据区上被初始化为正确的值。

问4: 初始化的依据是传入的参数,那这些参数值又存于何处呢?
答4: 这些参数,可能存储于只读区例如字符串,也可能以立即数的方式存储于程序里。例如int数值

汇编语言的数据像散兵游勇(最初汇编是不讲结构的),
c语言数据像地方上组织的杂牌军(结构),不经过培训就直接参战。
c++的对象则已经是全部受过培训的,由统一机构生产的,盔名甲亮的正规部队。
写到此,对类和对象先告一段落吧!睡觉!
Jinhao 2009-04-13
  • 打赏
  • 举报
回复
lz是喜剧演员?

>>话说cout, 它是ostream类创建的一个对象,它的功能就是抽取

有些术语用法有点错误,但是整个故事还是不错的。哈哈
li_il 2009-04-13
  • 打赏
  • 举报
回复
累什么累啊?有多累?
都是语法,class,语法,没什么好理解的。

ADT,抽象数据类型,C++比C强一点点,就强在这里。

ADT,数据和操作的组合。用于描述世界。

继承,重载,多态,私有公有。。。。都骗人的,想都不用想,不重要,附加值太低。

类关系,有一,是一,用一。等等。思想!!非常重要。

函数调用,模板变换,不重要。

面向对象思想!极其重要,靠他吃饭呀。


hjjdebug 2009-04-13
  • 打赏
  • 举报
回复
又见到两位兄弟,看来我真应该带点钱来,可是我穷啊,现在是打短工的,一花钱又
变成乞丐了,挺难听的,所以。。。
hylove9494 2009-04-13
  • 打赏
  • 举报
回复
顶下
弓虽!
wxgiter 2009-04-13
  • 打赏
  • 举报
回复
楼主真有才。。
hjjdebug 2009-04-13
  • 打赏
  • 举报
回复
hello, Mister Q, 谢谢捧场!
下面我们再来说说C++的多态。
c++的类是一个模型,它能够创造出对象,对象与对象相见是要发生作用的。
或者握手,或者打架,或者谁也不认识谁。
话说cout, 它是ostream类创建的一个对象,它的功能就是抽取。原来已经写好了能够把int, char
等简单数据类型的数据抽取到屏幕上。
现在我们写了一个类T1class, 我们想让cout 把我们这个类抽取到屏幕上。
可是cout 摇摇头说,我不会,我不认识你。
于是我们重载了ostream的抽取操作符, 对cout说, 其实很简单的,你只要这样做,这样做可以了。
cout 很高兴,因为它又认识了一位朋友T1class, 它长了本事了,
它可以抽取T1class类对象的数据。

C++的这种能力叫多态,有人把该例的多态叫静态多态或超前多态,其实我看叫类型多态更准确。
Qcontriver 2009-04-13
  • 打赏
  • 举报
回复
谢楼主,领教了。
hjjdebug 2009-04-13
  • 打赏
  • 举报
回复
程序说明:
对template <class TA, class TB=T1Class <TA> > class T2Class的理解

这是一个模板类,它有两个参数类型没有确定,一个叫TA, 一个叫TB.
如果声明对象没有指明第二个参数类型,就用缺省的T1Class<TA> 类型代替。其中 TA 就是第一个参数类型。
这说明,第二个参数类型是一个模板类类型。 此时的模板类,已经不是虚类型了,已经由TA类型对虚类型
进行了了特化。已经特化的模板类型是什么? 是已经确定了类型的类。
类是什么? 前面说过,类是模型,类是用来装东西的容器。这个容器是什么样子,那要看类的定义。
好了,现在模板2类型都确定下来了。后边是模板2类型的定义。 它定义了两个元素,定义了类的构造和析构。
所谓构造和析构及成员函数,就是怎样对对象的数据进行操作的函数。置于常说的创建,释放,多是与内存
分配相关的。

模板1是比较简单的,这里放进了一个ostream 友员函数, 为的是让cout能直接访问模板1类的私有成员。
另外重载了<<操作符, cout是系统预先定义的类,本来不知道怎样抽取模板1,
在这里重载之后,cout 就知道原来需要这样抽取该类了。 很简单,不是吗! 其它也就没什么东西了。
hjjdebug 2009-04-13
  • 打赏
  • 举报
回复
类只是一个模型,只有声明对象才有意义。
模板类是比类还虚的类,因为它的类成员变量和类成员函数连类型都没有确定。

越虚的东西,盛的东西越多。
老子曰:“埏埴以为器,当其无,有器之用。凿户牖以为室,当其无,有室之用“
意思是说,瓶子是空的,能盛水, 屋子是空的,能住人。
老子的光辉,跨越2500年,照到了模板类上。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧