动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.C语言递归.
.常见 Datagrid 错误.
.C++中对浮点数的格式化显示.
.Linux上搭建C/C++IDE.
.C程序设计例解(05).
.C语言的程序结构.
.C语言数组排序小结.
.利用C++实现哈夫曼算法.
.ASP.NET页面的处理过程完全版.
.C++箴言:使用对象管理资源.
.C语言入门之函数(1).
.异步串口通信 VC++.
.在CB中响应消息及自定义消息.
.创建一个带有CheckBox的TreeView.
.Web应用程序开发技术.
.C语言基础教程(五)函数.
.不同的CPU下最佳编译参数.
.多文件内核模块.
.主函数main中变量(int argc,char.
.修练8年C++面向对象程序设计之体.

学用C++的体会

发表日期:2008-3-8 |


       
      我在大学的时候,花了一个月时间学了C语言,后来,基本上做什么,都不用翻书了
后来看C++,觉得挺简单,学了一周,想不就是在C语言的基础上,加了一个class吗,工作了一年看的书多了,用的多了,才真正发现自己是井底之蛙。以前,看了所有的VC的书,其实,现在发现VC!=C++,vc只是一个编程环境啊。C++是一门语言。C++的精髓之区在面向对象的思想,为什么可以定义一个类,如何继续一个。说到底是面向对象分析,面向对象设计,也就是OOA/OOD,C++的复杂在于它的范围很广,因为,我们工作往往只能用到它的一部分啊。比如我们很少用模板,很少用那些高级的应用,其实,说到底,是我们的水平不够,大家看看loki库也许就知道,template有多大的威力。我个人认为,template,跟虚函数一样,属于多态的,不过,虚函数是通过指针,实现,在运行时候,进行解析,而template是编译期解析,我想它的实现跟宏定义差不多,但是,更加高级。

      还有一个问题,C++的编译器其实为我们的代码做了很多的事情。假如,我们不知道的话,那么,就会经常出现错误,我们应该始终记住这么一句话:"通用的往往是不好的,不适合工程的"。比如说:
函数为什么能够重载?

      其实 ,C++,是这样实现函数的名称对应的

比如:
class  A
{
   show(int a,int b);
   show(float a); 

};

      其实,它在内部是这样对应的:伪代码:

 show_INT_INT(int a,int b, void *this);
 show_FLOAT(float a,void *this);

      大家想想为什么会有一个this指针

      这样,自然,show()重载多少个都没有问题,从这也可以看出,内部实现,只是把函数的参数类型编进了函数名来实现重载,而没有把返回值编入,因此,函数名一样,参数个数一样,类型对应一样的,返回值不同的两个函数不能构成重载,会出现编译错误。(我们可以想想为什么不把返回值编入函数名里,假如,只有两个函数返回值不同,比如如下:

class B
{
  public:
   int  print(int a);
   void print(int a);
}

      假如,把返回值也编入函数名的话,那么它们应该可以构成重载。当你这样如下调用时候,

 B a;
 a.print(20);

      编译器怎么知道它是调用那个函数。

2,函数参数传入传出的规则

      在函数调用的时候,有三种情况,第一种参数为数值,第二种为传指针,第三种传引用,此外,还有,为const,和non-const的区别。什么情况下该传数值,什么情况下不该传呢,我觉得假如参数是基本类型的话,没有关系,假如参数是对象的话,就不能传数值,因为,它会调用对应的构造函数。(知道为什么吗)

      解释:函数参数的传入,在函数的内部会产生几个临时变量,来拷贝函数的参数数值。比如:
  
fun(X a)
{
}

      那么,在函数对应的堆上,会为a变量开辟空间(m_a),并调用X类的拷贝构造函数来初始化化m_a,如下:X,m_a(a);类似这样。有时候,一个类包含很多变量,构造函数比较复杂,那么,这样的调用fun()会浪费很多系统时间。因此,极力反对用传值调用对象参数的函数。还有一个,大家经常碰到的问题,就似const 修饰参数与没有const的区别。有了const的修饰,在函数内部就不会为参数产生临时变量了,这样,自然,不会调用什么参数类的构造函数了,也不会为参数分配空间了。同时,这样的参数也不能在函数中改变它的数值。


3,拷贝构造函数
      我们往往忘了写这样一个函数,也许不需要。其实,我们没有写的时候,不过,编译器自动为我们生成一个。

比如:
class A{
    private: 
           int x;
          char *str_name;
  public :
        A(int x,char *str);     
};

      在这里,我们没有定义一个拷贝构造函数,假如出现这样的例子
fun(A x)
{
}

      从上边的例子,我们知道,调用fun()函数的时候,会要调用A类的拷贝构造函数的 这样,假如,没有定义的话,那么,系统产生一个拷贝构造函数(按照位拷贝变量的值),这样,我们知道,str_name只是一个指针,当临时变量的str_name成员也指向参数的str_name的位置时候,这样,我们就踏上了,一个地雷阵了。为什么,我们想啊,当执行完,fun()函数的时候,临时变量,在某个不确定的时刻就要free()掉,这样,临时变量str_name也会delete,而我们知道,这个str_name跟参数的str_name指向的同一个内存块,那么,当free一次后,那么它的内容就没有了这样,破坏了参数数据内容。


Kusk (2003-8-14 22:46:40)  读完此文,觉得有商榷之处: 

----------------------------------------------------- 我觉得假如参数是基本类型的话,没有关系,假如参数是对象的话,就不能传数值,因为,它会调用对应的构造函数。 

----------------------------------------------------- 对象也可以传值的,为什么调用构造函数就不能传值呢?只不过有时从效率的角度以及对某些不便复制的对象我们更倾向于使用引用罢了。 

----------------------------------------------------- 有了const的修饰,在函数内部就不会为参数产生临时变量了,这样,自然,不会调用什么参数类的构造函数了,也不会为参数分配空间了。 

----------------------------------------------------- 不知道仁兄从哪里得出的这个结论,假如这样的话我们似乎没有必要写fun(const yourClass& a)这样的以引用为参数函数声明,只须要写fun(const yourClass a)行了,但两者的确是有区别的,后者同样会调用拷贝构造函数产生临时变量! 

----------------------------------------------------- 拷贝构造函数我们往往忘了写这样一个函数,也许不需要。其实,我们没有写的时候,不过,编译器自动为我们生成一个。 

----------------------------------------------------- 我引用一下Lippman的《Inside the C++ Object Model 中文版》: “假如一个class未定义出copy constrUCtor,编译器就自动为它产生出一个”这句话不对,而是应该像ARM所说: Default constructors和copy constructors在必要的时候才由编译器产生出来。这个句子中的“必要”意指当class不展现bitwise copy semantics时,C++ Standard仍然保留了ARM的意义…… 按贴主的意思,可能他把“位拷贝(bitwise copy semantics)”也当成构造函数的职责了,事实上并非如此:位拷贝恰恰是没有定义构造函数(包括人为显式定义以及“必要时”系统的隐式定义)时才发生的。位拷贝的过程是编译器的动作,不属于构造函数调用。 
 


C++基础知识
以下来自www.csdn.net  作者taozhangzhi9

      C++的知识很多,有四库全书《C++ 程序设计》,《C Primer》,这本文章只想谈谈我个人所看到的用到的知识。加上自己的理解。很多东西可能没有系统化,而且,知识也是想到那写到那。

首先谈谈 类的对象的大小,

 class  A
{
};

main()

      A  a;
      cout< }

它的结果会是多少呢?

答案为1。

为什么?它没有定义任何变量,按道理,应该为0的啊。这是为了保证每一个对象的内存地址都是唯一的。比如:

      A  a,b;

假如,长度为0,那么,a,b的内存地址,就可能是一个,这样,会产生一些不必要的麻烦。

那么
class A
{
      char m;
};

main()
{
      A  a;
      cout< }

会打印结果为多少啊。答案为4

      这个问题叫Alignment,有一次,我就碰到这样郁闷的问题,我们的工程中代码都是用数组传送数据,比如坐标 x,y,那么就这样赋值

*(int *)&w[0]=x; 

*(int *)&w[4]=y;

      (或许大家很少用),这样的代码有一个缺点,送数据,取数据十分不方便,而且,由于有下标,因此,代码不好利用循环结构(还有不是四位的数据) 。只能一位一位的赋值,还有一个问题,就是,当工程一个约定变了的时候,所有的代码都要改动。不好reuse。

      因此,我希望借助结构strcut,或者class来改造程序代码,但是就碰到数据对齐问题。

      比如,我定义一个结构
struct A
{
      char type;
      int y;
};

      然后,这样使用。

char  buf[MAX]; 
A a;
memcpy(buf,&a,sizeof(a));

      但是,却发现buf[]的内容有三个不是我需要的内容。其实,内容图示如下:

 
      我看了一些资料,说这是为了字节对齐,CPU存取数据是按照四位存取,这样,就不会取四位数据,一位是char type,三位是y的数据。作为编程者对这个有可能就不熟悉。还有类似的问题,以后,再叙。

类的数据的访问权限

      数据有三种权限:public,private,protected。C++是面向对象的语言,因此,它的许多概念来源于现实生活。比如这个权限问题就可以这么解释。基本类相当于父亲,子类相当于孩子,还有一个友元类,相当于朋友。

      比如,对于父亲有的东西(成员变量)是对任何人都共享的,大家都可以知道的,不是什么秘密。那么,用public来描述这样的东西。

      假如,有的东西,是只有不是外人不能知道的,也就是,儿子,好朋友都可以分享的秘密的话,那么,这样的东西用protected描述。

      同样,还有的东西,大人不想让小孩知道,但是,却对好朋友不保留,这样的事情,在现实生活中也是有的,那么,这样的用private描述。

上一篇:一个简单菜单程序 人气:523
下一篇:学数学也要学点偷懒的技术 人气:336
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-12 team论坛 v2.0.4 bulid 080916 A
2008-10-12 Roclog v3.1.6
2008-10-12 SupeV v1.0.1 简体中文 GBK
2008-10-12 NetCMS v1.6.0.1010 正式版
2008-10-12 PHP考试系统PPFrame v1.2.7
2008-10-12 LPAS个人相册 v1.6.3
2008-10-12 快问仿百度知道系统 动态-静态-互
2008-10-12 方卡广告防点击系统 V1.0 GB2312
2008-10-12 泡菜内容管理系统[PCMS] v1.0 Bu
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成