注册 登录
编程论坛 C++教室

[求助]关于学C++是否需要学习C

ichigo 发布于 2007-06-16 10:54, 2495 次点击

有些书上写学习C++不需要学过C
可是C++是C的超集
C是C++的子集
C的那些函数需要学习吗?
还有那些预处理指令是不是都很重要呢
学好C++是不是这些都需要呢?

42 回复
#2
yuyunliuhen2007-06-16 11:24
这要看你想往哪方面发展了,如果偏向于底层,系统编程,嵌入式开发的话,那么C,c++,汇编都很有必要。。

仅代表个人看法,^_^
#3
aipb20072007-06-16 11:30
我斗没学c啊!个人觉得还可以,c是过程化的语言,c++是面向对象的。

所以学了c再学c++可能会有个思想转化的过程。

不过有c基础,看c++肯定会更容易,更好理解!
#4
cilubutong2007-06-16 11:47
我现在也没有学C就学C++,我自己现在感觉有点难,建议你有时间就看下C就可以了.
#5
野比2007-06-16 12:25

C是个好东西, 我现在作单片机只要有机会就用C, 不到万不得已不用汇编...
C++只有在做驱动的时候用下, 所以算是临时抱下佛脚
在我看来C和C++除了语法上相似和可以向下兼容外, 根本不是一个思维..
C基本算"高级汇编", 而C++真正算是高级语言了..
如果你以后也搞电子开发的话, 还是多看些C吧..我的建议.
搞软件那就可以只看C++了, 不用理C

#6
sqyang5212007-06-16 12:49
其实,这两者之间都是差不多的,如果你C++好的话,那么C只需要看一下就可以掌握了~~
#7
ioriliao2007-06-16 13:25
最主要的区别是两者的编程思想不同.
不过也可以用C++的思想在C中编程,但
不能完全实现!
#8
yuyunliuhen2007-06-16 17:04
C 也可以实现面向对象的思想,比如说用结构  ^_^
#9
aipb20072007-06-16 17:08

弱弱的问下:
在c的结构体中有访问控制吗?

#10
yuyunliuhen2007-06-16 17:25

有啊, class的默认访问权限是private,而struct默认访问权限是public.它一样可以有private,public,protected.
class和struct基本就是一个东西。语法上没有任何其它区别,除了上面那点,类本身就是从结构引申过来的。
结构一样可以多重继承,如:
#include <stdio.h>

struct A1 { virtual ~A1() { printf("A1 dtor\n"); } };
struct A2 : A1 { virtual ~A2() { printf("A2 dtor\n"); } };
struct A3 : A2 { virtual ~A3() { printf("A3 dtor\n"); } };

struct B1 { ~B1() { printf("B1 dtor\n"); } };
struct B2 : B1 { ~B2() { printf("B2 dtor\n"); } };
struct B3 : B2 { ~B3() { printf("B3 dtor\n"); } };

int main() {
A1 * a = new A3;
delete a;
printf("\n");

B1 * b = new B3;
delete b;
printf("\n");

B3 * b2 = new B3;
delete b2;
}
------------------------------MSDN-------------------------------------------
都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数,上面也体现了虚函数吧。


除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。

其实结构体功能也是满大的。。。。^_^

#11
菜鸟0082007-06-16 19:43
好强
#12
孤魂居士2007-06-16 23:35

还是学下C
你不如用老潭的C++
前面8章简单的还是讲了下C
先了解下C然后专心学习C++还是比较轻松些 要不然 新手入门有点累...我们学校开的直接就是C++
我们是计算机专业 我们班的没有几个人愿意学了 特别是到后面接触类对象的时候`````还是了解下C
#13
ioriliao2007-06-16 23:39
个人认为学习编程要走的路是 过程化的语言--&gt;结构化的语言--&gt;面向对象的语言--&gt;最终走的路就是泛型编程
#14
ichigo2007-06-17 09:20
谢谢大家哈...

那如果做游戏,需要哪方面呢?
#15
ioriliao2007-06-17 09:37
做游戏学会用opengl函数库就行了.不过那只是一个函数库,还是那句老话,算法才是最重要的!
#16
aipb20072007-06-17 09:53
以后将会是泛型的天下!
#17
傻憨憨2007-06-17 11:15

哎呀,这些东西好精辟哦,太高深了啊,还看不懂呢,呵呵

#18
simonray2007-06-17 15:23
看了很多评论,感觉就是仁者见仁,智者见智.
自认为还是根据自己的所需来择学习的领域.
#19
ioriliao2007-06-17 15:38
好个仁者见仁,智者见智.
#20
ichigo2007-06-17 19:09
以下是引用aipb2007在2007-6-17 9:53:01的发言:
以后将会是泛型的天下!

泛型是啥...

#21
孤魂居士2007-06-18 14:41

顶楼上斑竹的
#22
xq07142007-06-18 18:52
可有可无!只是一开始就学习OPP我觉得倒不会受些思想的束缚!
我是先学C的,但学C++时很少去写类还是当C来做!
改不了过程化语言的习惯啊 !总是觉得写了类不是多事一举吗?直接实现不就可以!
后来真正学习C++,才明白OPP的真谛!
#23
ioriliao2007-06-18 19:20
oop与语言无关,这是一种思想.用过程化语言写程序一样可以用oop的思想,只不过实现起来比较难.
C++或其它面向对象的语言只是作为实现这种思想工具.
#24
ichigo2007-06-18 23:08
以下是引用xq0714在2007-6-18 18:52:57的发言:
可有可无!只是一开始就学习OPP我觉得倒不会受些思想的束缚!
我是先学C的,但学C++时很少去写类还是当C来做!
改不了过程化语言的习惯啊 !总是觉得写了类不是多事一举吗?直接实现不就可以!
后来真正学习C++,才明白OPP的真谛!

我到没觉得多此一举,不过我也觉得不写类应该也可以实现

#25
龙飞2007-06-19 00:13

学了C,要再想转变思考方法,感觉挺难的,我现在学C++都不知道怎么突显C++的优点,感觉除了类以外,差不多都是用C的来做。。
但还是可以实现想要的功能。。
真不知道,面向过程和面向对象有什么区别。。。
有谁告诉下,C++的优点到底表现在哪些方面??

#26
ioriliao2007-06-19 10:04

如果你们没有真正做过稍微大一点的项目你们是很难以理解oo的思想的!

你们可知道为什么有了Microsoft Visual Studio 6.0而现在又出了个
Microsoft Visual Studio .net

或者你会说.net 的功能比 6.0的功能强大.

但你又知道是怎么样的强大法,体现在哪些方面.

或者你会说.net有强大的类库.强大的ide功能.

你可知道类库的本质是什么.

类库的本质就是实现了代码复用.

写类库不就是写类了.dll你应该知道吧.

我说个实例:
用结构或过程化的思想写以下代码:
//项目A
#include <iostream>

using namespace std;

void print();

int main()
{
print();
return 0;
}

void print()
{
cout<<"代码重用"<<endl;
}

好了.这是一个很简单的程序,过了些日子,我又接到了一个新的项目(项目B),然而这个项目有一个功能在上次那一个
项目A中实现过了的,现在你想到的要做的就是打开上一次那个项目A找到print()这段代码copy到项目B中相应的地方.好了,现在或者会反驳我,我这又不是代码重用了.是的,没错,是代码重用了.
好了,接着我发现在项目B中的print()功能要再加上一个cout的功能,好的,那么你就会想到在copy过来的地方再加上一句cout<<"XXX"<<endl;
好的,我知道你还没看出问题,因为例子实在太简单了, 但如果这个print()函数是有n行(n>10000)代码长度的情况问题就来了.首先你必须把这n行代码copy到项目B,第二在copy的过程中可能会出现copy少了几个字母(虽然机率很小,但确实存在),第三,当你要修改一个功能时你就得在这n行长的代码中寻找要修改的地方.第四增加了程序整体代码的长度,维护成本就会增加.第五,如果这个项目B不是你自己的,而是另一个公司接的,然而这个公司知道你有一段代码可以实现那个项目的一些功能,然后那公司向你购买实现那功能的代码.然而你只想让那公司用那代码实现某些功能就行了,不想让他们知道这功能的具体实现细节是什么,然而,你写的代码不可能做到这一点(只有给源码了).oo的一个特性--封装性,就可以做到这一点.就像我们在窗体拖放一个按钮时,我们是不知道实现那个按钮的代码是什么,就知道那个按钮有某些功能,如单击的功能...
然而,你的这个代码重用还有一个问题,就是只有你自己才知道你先前写的程序的某些代码可以在另一个程序重用,就算你说我会告诉别人的,我知道你会告诉别人的,你会说在某某个文件,第N行某某个函数,要copy某某.....

然而,像我们用c++的标准库时有人告诉我们在copy某某吗,只是有一个文档说明了功能的接口,我们不必到某某文件copy某某,只要包含这个头文件就行了.无论某个c++的标准库实现的代码长度有多长,然而都不会增加我们程序的代码长度,若是说有就那么一行 #include<XXX>

再用一个例子说明白一下代码重用吧,
代码仍然是项目A的代码:

//项目A
#include <iostream>

using namespace std;

void print();

int main()
{
print();
return 0;
}

void print()
{
cout<<"代码重用"<<endl;
}

#27
ioriliao2007-06-19 10:04

我们定义了一个函数就可以实现在多处调用,作用不外是有多处功能相同的地方不用写相现的实现代码,只调用一个定义好了的函数就得了,这是本程序内的代码重用,但我们想要的是任何人都可以很简单的在他们的程序里调用这个功能,就像我们用cout功能时,只要#include <iostream> 就行了.你就必须用C++提供的写类的手段去实现这样的事情.

软件工程强调的是什么?强调的是代码的重用性,可维护性.软件工程不外是围绕着这两个方面的问题!
自机器语言以来,各种语言从低级到高级的不断涌现,编程的方法从什么也不是到过程化到结构化到对象化.
这些转变不外是围绕着代码重用和软件的可维护性面展开的. 当你有一天自己写程序的时候,在不同的项目中
重覆地写着很多在经前项目中的代码,你就会知道代码重用的重要性了. 当过了n年时间的时候,客户要求
修改软件的时候你就知道维护性的重要了..软件工程中还强调软件的可扩展性,可移植性..

如果你真的想体会oo的与过程或结构化语言的区别,我建议你试着做个稍大些的项目.就算你现在还不会oo
,那么就用过程化或结构化的思想去做一个大项目,你一定会发现问题的所在.

我不认为从一开始就去接受oo的思想,应该从过程化的思想开始,古人云:吃一斩,长一智.
如果你不曾经历过过程化或结构化思想的局限性,就不能深刻地体会oo的优越性(个人观点)

#28
zkkpkk2007-06-19 13:28
我们的老师教C++,前面的部分几乎是在教C,后面加入面向对象了也很自然
#29
aipb20072007-06-19 14:19
以下是引用龙飞在2007-6-19 0:13:04的发言:

学了C,要再想转变思考方法,感觉挺难的,我现在学C++都不知道怎么突显C++的优点,感觉除了类以外,差不多都是用C的来做。。
但还是可以实现想要的功能。。
真不知道,面向过程和面向对象有什么区别。。。
有谁告诉下,C++的优点到底表现在哪些方面??

恰好我有个实例,不知道算不算哦!

早上在写 广度 和 深度 遍历图的的代码,因为之前的数据结构题目,比如写个什么树只类的,我用的都是基于类的,可以说是面向对象吧。这样也顺手的多,我学的c++,所以oo的思想很固化。
但是我今天就没用类,直接写了两个结构体,一个接点,一个封装数组的存储器,然后就用函数开始建图,然后广度,深度遍历。

写好了,实现了,问题也来了,用了这么多的new操作,怎么delete?
如果有对象这样概念,那太好了,在析够一个对象的时候就可以手动释放。
但是现在,main函数里就几个函数调用,new操作又是函数中的局部域,我实在是不知道怎么释放内存。
我又看了看机器上老师的代码,他是学c的,晕,他也没有释放,可能忘记了还是处于和我一样的原因,我就不知道了。


哪位大哥给我出个办法?怎么delete啊?

#30
zkkpkk2007-06-19 16:02
回复:(aipb2007)以下是引用龙飞在2007-6-19 0:13:0...

C没有delete,C用的是free();函数,其实OO很难说清楚的,我也不知道是很清楚,就算清楚了也说不清楚,不过我觉得楼上版主的面向对象也还是不深,因为我和华科的老谢谈这个的时候他说得更悬,或许也是版主没表达出来?但是C有没有多态、有没有虚和抽象啊?

#31
yuyunliuhen2007-06-19 16:07
哈哈,讨论的够广的
#32
aipb20072007-06-19 16:35
以下是引用zkkpkk在2007-6-19 16:02:05的发言:

C没有delete,C用的是free();函数,其实OO很难说清楚的,我也不知道是很清楚,就算清楚了也说不清楚,不过我觉得楼上版主的面向对象也还是不深,因为我和华科的老谢谈这个的时候他说得更悬,或许也是版主没表达出来?但是C有没有多态、有没有虚和抽象啊?

呵呵,谢谢你。
我没说清楚,我知道c不用delete,我只是说我写代码时,刻意回避了使用类,其实类是理解面向对象的关键,因为类使程序员具有了对象的概念,c++,c都只是语言,工具,面向对象和面向过程是种思想,所以在c++中也可以过程化,只是c++语言的特性使它更好的支持面向对象的思想。
就比如我那例子里,因为我回避了对象这个概念,我就在释放内存这个问题上困惑了。

当然,这仅仅是个例子,不代表这就体现面向对象的所有。

#33
zkkpkk2007-06-19 17:14

接口、多态、泛型,都是面向对象的特点,我想知道C语言怎么实现动态连编,有没有动态连编,好象连重载这种编译时多态都没有吧?不过刚才看到结构体的继承了......

#34
ioriliao2007-06-19 18:01
C没有delete,C用的是free();函数,其实OO很难说清楚的,我也不知道是很清楚,就算清楚了也说不清楚,不过我觉得楼上版主的面向对象也还是不深,因为我和华科的老谢谈这个的时候他说得更悬,或许也是版主没表达出来?但是C有没有多态、有没有虚和抽象啊?

你可知道C++是由C进化而来的,如果你认为
C是不可以实现面向对象的编程,那是能力的
问题,就是说为了用C更好地实现面向对象的
编程那么就得C去扩展C,扩展了么,就是C++
书上不是说得很明白吗,C++是C的一个超集.
.
#35
ichigo2007-06-19 19:31
以下是引用aipb2007在2007-6-19 16:35:40的发言:

其实类是理解面向对象的关键,因为类使程序员具有了对象的概念,c++,c都只是语言,工具,面向对象和面向过程是种思想,所以在c++中也可以过程化,只是c++语言的特性使它更好的支持面向对象的思想。

#36
ioriliao2007-06-19 19:38
如果真的想知道结构化与对象化的区别,我建义看看软件工程的书.
#37
ichigo2007-06-19 23:09
以下是引用ioriliao在2007-6-19 19:38:48的发言:
如果真的想知道结构化与对象化的区别,我建义看看软件工程的书.

我是非常非常新的新手...
还没怎么着呢...
就是看到了书上讲了很多C的函数的东西,想问问需要不需要去学学C...
结果扯出这么老远了...呵呵

#38
孤魂居士2007-06-19 23:25

斑竹门的知识太深奥了``
#39
ioriliao2007-06-20 08:21
以下是引用ichigo在2007-6-19 23:09:30的发言:

我是非常非常新的新手...
还没怎么着呢...
就是看到了书上讲了很多C的函数的东西,想问问需要不需要去学学C...
结果扯出这么老远了...呵呵

函数是要去学的,但不是要学会了全部的C函数才能去学习C++,函数只是一种别人已写出来的功能.
学习它不外是去了解它的接口.归根到底我们要学的是编程的方法,或者是说算法,个人认为,得先
学会C++的基本的用法,然后去学数据结构算法这些.

#40
ichigo2007-06-20 10:32
以下是引用ioriliao在2007-6-20 8:21:46的发言:

函数是要去学的,但不是要学会了全部的C函数才能去学习C++,函数只是一种别人已写出来的功能.
学习它不外是去了解它的接口.归根到底我们要学的是编程的方法,或者是说算法,个人认为,得先
学会C++的基本的用法,然后去学数据结构算法这些.

谢谢。..
算法很难...我看出来了..

#41
zkkpkk2007-06-20 11:20
以下是引用ioriliao在2007-6-19 18:01:03的发言:

你可知道C++是由C进化而来的,如果你认为
C是不可以实现面向对象的编程,那是能力的
问题,就是说为了用C更好地实现面向对象的
编程那么就得C去扩展C,扩展了么,就是C++
书上不是说得很明白吗,C++是C的一个超集.
.

我只是问C有没有这些而已,也没有说C不能面向对象,C++是C进化来的所以课程叫C/C++,你只把我的问题当作普通正常的提问便可以了,也不要以为我后面的话是反问,我知道你们已经出去接触社会的做过项目的人心机都很重,什么都以为是反问,你只要把我的话当作正常的提问便可以了,因为我不是学纯C的只不过因为老师语法基础阶段当做C来教而已所以标准的C语言有没有C++的这些特性,或者是后面加没加进去我是不知道的

#42
aipb20072007-06-20 11:28
呵呵~讨论就好~
#43
ioriliao2007-06-20 12:02
以下是引用zkkpkk在2007-6-20 11:20:52的发言:

我只是问C有没有这些而已,也没有说C不能面向对象,C++是C进化来的所以课程叫C/C++,你只把我的问题当作普通正常的提问便可以了,也不要以为我后面的话是反问,我知道你们已经出去接触社会的做过项目的人心机都很重,什么都以为是反问,你只要把我的话当作正常的提问便可以了,因为我不是学纯C的只不过因为老师语法基础阶段当做C来教而已所以标准的C语言有没有C++的这些特性,或者是后面加没加进去我是不知道的

就当我误解了.其实我就该理解为C有没有现成的这样的特性.

1