C++学习一些小结

一、构造和析构函数

C++在幕后为你写的的函数:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:

class Empty{};

和你这么写是一样的:

class Empty
{
public:
    Empty();                        // 缺省构造函数
    Empty(const Empty& rhs);        // 拷贝构造函数

    ~Empty();                       // 析构函数
    Empty & operator=(const Empty& rhs); // 赋值运算符

    Empty* operator&();             // 取址运算符
    const Empty* operator&() const;
};

深拷贝和浅拷贝:
默认拷贝构造函数均是浅拷贝。但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存,析构函数释放了这个内存,则此时就需要进行深拷贝了,深拷贝不能依赖编译器实现。
为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符。

拷贝构造函数的调用:
1、当用类的一个对象去初始化该类的另一个对象时。
2、当对象作为函数的实参传递给函数的形参时。
3、当函数的返回值是类的对象,函数执行完成返回时。

在构造函数中调用另一个构造函数,会生成一个临时对象,并且立即释放。 
string c=a;只调用了拷贝构造函数。而string c; c=a;分别调用了构造函数和赋值函数。

构造函数和析构函数的注意点:
1、构造函数和析构函数不能有返回值。
2、可以显式调用构造函数和析构函数。
3、拷贝(复制)构造函数不能用值传递。
4、不要在构造函数和析构函数中抛出异常和调用有异常抛出的函数,可能引起内存泄露!
5、确定基类有虚析构函数,当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。(测试的结果是:派生类的析构函数没有被调用 )
6、为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符。

二、static、const、友元与虚函数

1.静态成员使用static申明,在内存中永远只有一份实例(静态变量,类内声明,类外定义)
2.静态成员是类的对象所共有的
3.静态成员变量可以被成员函数访问,但静态成员函数只能访问静态成员变量
4.友元是为了一个普通函数直接访问一个类的保护甚至是私有成员的机制

虚函数:
在普通成员函数前面加 virtual 关键字
一个函数在基类申明一个virtual,那么在所有的派生类都是是virtual的
一个函数在基类为普通函数,在派生类定义为virtual的函数称为越位

抽象类:
具有纯虚函数的类就是抽象类
抽象类不能被实例化,所以抽象类只能以指针方式被应用
抽象类可以防止切片的发生
抽象类不产生虚表

const对象与成员:
1.const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数
2.const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的
3.const成员函数不可以修改对象的数据,不管对象是否具有const性质
4.mutable修饰的数据成员,non-const和const成员函数都是可以修改它的
5.尽可能地使用const

三、设计与实现

C++面向对象编程中一条重要的规则是:公有继承意味着“是一个”。一定要牢牢记住这条规则。
类的非虚成员函数,实际上是在说这个函数表示了一种特殊性上的不变性,子类不能改变这种“不变性”。
1.共同的基类意味着共同的特性。如果类D1和类D2都把类B声明为基类,D1和D2将从B继承共同的数据成员和/或共同的成员函数。
2.公有继承意味着“是一个”。如果类D公有继承于类B,类型D的每一个对象也是一个类型B的对象,但反过来不成立。
3.私有继承意味着“用...来实现”。如果类D私有继承于类B,类型D的对象只不过是用类型B的对象来实现而已,类型B和类型D的对象之间不存在概念上的关系。
4.分层意味着“有一个”或“用...来实现”。如果类A包含一个类型B的数据成员,类型A的对象要么具有一个类型为B的部件,要么在实现中使用了类型B的对象。

C++有两种多态多态形式:
1、编译时刻多态,编译时刻多态依靠函数重载或者模板实现
2、运行时刻多态。运行时刻多态依靠虚函数虚接口实现

引用的使用原则:
1.在可以用引用的情况下,不要用指针
2.引用可以作为“左值”
3.引用不允许为空,当存在对象为空时,必须使用指针。 引用指向一个空值,是非常有害的!
4.尽量用“传引用”而不用“传值”
5.必须返回一个对象时不要试图返回一个引用
6.千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用

类有const数据,必须要有构造函数对它初始化。
但是静态常量如下初始化:
static const double a;       //静态double常量声明!
const double 类名::a=1.04;   //静态初始化!
类的静态常量整型可以直接在类中初始化:static const int hashnum = 7;

T& operator[](int index); //传回数组的一个元素,可读,可写
const T& operator[](int index)const;  //传回数组的一个元素,可读,不可写

重载函数,区分是不是重载函数的标准:
(1)只能靠函数的参数来区分重载函数(类型、个数、缺省参数)
(2)不能靠函数的返回值来区分重载函数

四、C++与C的一些区别

C中struct和C++中struct的区别:
C++的struct可以当作class来用,区别是,class中的成员默认是private,而struct的成员默认为public。 
C中的struct只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员不可以是函数。 
C中的Struct是用户自定义数据类型(UDT),C++中的Struct是抽象数据类型(ADT),支持成员函数的定义。

C++语言担保,如果p等于NULL,则delete p不作任何事情。
delete p 是一个两步的过程:调用析构函数,然后释放内存。
delete p调用的是operator delete(void*),而delete[] p调用的是operator delete[](void*)。

static 关键字至少有下列作用:   
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值。
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内。
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

const 关键字至少有下列作用:   
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了。
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为 const,或二者同时指 定为const。
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值。
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量。
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

参考:

《C++ primer》

《Effective C++》

 

作者:阿凡卢

出处:http://www.cnblogs.com/luxiaoxun/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

http://www.cnblogs.com/luxiaoxun/archive/2012/09/07/2675662.html

时间: 2024-08-01 09:44:26

C++学习一些小结的相关文章

MySql存储过程学习知识小结_Mysql

什么是存储过程: 存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了. 存储过程的好处: 1.由于数据库执行动作时,是先编译后执行的.然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高. 2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率. 3.通过存储过程能够使没有权限的

烟台SEO:如何学习SEO小结

写这个题目,其实有些大.因为SEO包含的范围太广,但是最近对SEO的体会越来越大,慢慢掌握了如何在搜索引擎中将自己的网站优化到百度和谷歌的首页.学习SEO我个人感觉有几下几点大家可以参考.只要你按照我所说的去做,排名几乎都可以提上来. 1.保持一个良好的心态,不要欺骗别人,不要投机取巧,SEO是手段而不是目的. SEO的最大作用就是让你不去寻找客户,而是让客户主动找你.因此,如果你学习了SEO,想通过SEO去提升自己的业绩,那么就要踏踏实实的做网站优化.不要去欺骗,不要为了流量而做SEO;不要去

写给想学习Javascript的朋友一点学习经验小结_基础知识

当然只是个人的经验,有什么不对的也请高手见谅和指正. 关于到培训学校学习的忠告:别说现在没有这样的学校,就是有专门的学校也不要去,因为不会有好的老师的.不要浪费你自己(很可能是你父母)的钱和时间.趁早死了这个念头. 关于培训学校的这个我想我要比一般的朋友更有发言权,因为我本人干英语培训将近2年,我很清楚培训市场的情况,你很难碰到一个好的老师.英语可能还好些,毕竟英语说得好的老师还比较多,长期跟老外泡在一起,确实对口语能力的提高很显著,但是代价是很昂贵的.而你现在要学的是Javascript,呵呵

学习PHP小结:PHP编程中常用的三则技巧

1.配置PHP文件目录 作为服务器端解释执行的脚本语言,PHP程序放置在某个服务器可以访问的目录下,一般可以通过修改Apache的httpd.conj进行配置,例如我们在该文件中的一句: Alias /test/ "d:brhpwebsitebrhp/" 那么在浏览器端输入:"http://localhost/test/+PHP文件名"就可以访问d:brhpwebsitebrhp/下的PHP文件了:可见该行不过是为存放PHP文件的目录起一个别名. 其次,还可以通过指

BASH 学习笔记小结_linux shell

1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执行: 编译 chmod +x filename 这样才能用./filename 来运行 1.1.2 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束.我们真诚地建议您

PHP 函数学习简单小结_php技巧

file_exists() 检查文件或目录是否存在 说明 bool file_exists ( string filename ) 如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE. dirname() 函数返回路径中的目录部分. 语法 dirname(path) path 必需.规定要检查的路径. 例子 <?php echo dirname("c:/testweb/home.php"); echo dirname("/testweb

一天精通asp.net的学习经验小结_实用技巧

1.Validator 2.IsPostBack 3.AutoPostBack.控件离开焦点的时候自动Post. 4.repeater控件的使用.:Repeater控件比以前版本的asp.net好用了,只要 Eval就可以了,不用DataBinder.Eval(container.DataItem,"***"):了,只要Eval("Name")就可以,注意不能丢了前面的"#". <asp:Repeater ID="Repeater

jQuery .tmpl(), .template()学习资料小结_jquery

昨晚无意中发现一个有趣的jQuery插件.tmpl(),其文档在这里.官方解释对该插件的说明:将匹配的第一个元素作为模板,render指定的数据,签名如下: .tmpl([data,][options]) 其中参数data的用途很明显:用于render的数据,可以是任意js类型,包括数组和对象.options一般情况下都是选项了,官方指出,此处的options是一个用户自定义的键值对的map,继承自tmplItem数据结构,适用于模板render动作期间. 在这里可以下载到最新的tmpl插件,值

ReWrite学习笔记小结_win服务器

比如,下面,我要实现这样的URL:  http://xxx.com/0725  http://xxx.com/0726  http://xxx.com/0727  -  上面xxx.com是一个记录<今天是>这样的历史内容的一个测试站点.上面链接的意思,就是显示07月25日的历史上发生了什么事情,类似这样.这样看起来就很美观.整齐了.要不然,可能的地址就是:  http://xxx.com/index.php?t...  http://xxx.com/index.php?t...  http: