码迷,mamicode.com
首页 > 编程语言 > 详细

C++学习笔记3

时间:2016-03-26 15:32:19      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

 

1.构造器

      1.与类同名,无返回,在生成对象(栈、堆)时系统自动调用,一般用于初始化

      2.可有参数,则可以默认参数、可以重载。重载和默认不能同时使用,但要包含无参构造器,即用默认参数实现:有参构造器包含了默认构造器,使其实现对象的无参创建。

      3.若无构造器则系统默认生成一个无参构造器,若有构造器则不会生成无参构造器。 【无参构造器使用:Data s;  其中Data是构造器名,s为对象。有参构造器:Data s(1)】,此时无参和有参的构成重载。

2.析构器

      1.与类同名,前面加~。无参无返回,对象消失时自动调用,用于对象销毁时的内存释放。若未提供,系统默认提供空析构器。

 

主函数:main.cpp

 

#include <iostream>
#include"mystring.h"

using namespace std;

int main()
{
    mystring s;
    mystring s2("哈哈");
    cout<<s.c_str()<<endl;
    cout<<s2.c_str()<<endl;
    return 0;
}

 

头文件:mystring.h

class mystring
{
public:
    mystring(const char *s=NULL);
    ~mystring();
    char *c_str();
private:
    char *_str;
};

 

 

文件:mystring.cpp

#include "mystring.h"
#include<string.h>
#include<iostream>
using namespace std;
mystring::mystring(const char * s)
{
    if(s==NULL)
    {
        cout<<"调用无参构造器\n";
        _str=new char[1];
        *_str=\0;
    }
    else
    {
        cout<<"调用有参构造器\n";
        int len=strlen(s);
        _str=new char[len+1];
        strcpy(_str,s);
    }
}

mystring::~mystring()
{
    delete []_str;
    cout<<"调用析构器\n";
}

char * mystring::c_str()
{
    return _str;
}

输出结果:

技术分享

注意:

1.构造器和析构器一定要是public

2.其默认参数在声明中实现,定义中不能出现默认参数。

3.构造器和析构器实现时别忘在前面加其类名和作用域符号。

4.用于接收new分配的空间单位一定要是一个指针变量,赋初值时一定要是加上*(忘加的话析构的是你赋的初值作为地址的空间,我自己遇到的问题。)

5.用NULL时要包含头文件string.h或cstdio.h(在哪个文件中用就在哪个文件中加,否则会提示NULL不在其范围且编译不通过)

6.默认和重载都可以包含无参的情况,此代码是构造器利用默认参数,包含了无参的情况【此方法比较好】。

7.上面代码中,析构器先析构s2,再析构s。即先构造的后析构。

8.若定义mystring *p;   则要delete p;   其中析构器先析构的是p空间中的_str所指向的空间,再析构p。【其遵循的规律和6一样】

9.构造器不是为了创建对象,是为对象初始化【即分配空间】,析构器也不是用来释放对象的,而是在对象消失之前释放构造器为其分配的空间。

例如:

class  A

{

public:

    A()

    {

        name=new char[100];

    }

    char *name;

    int age ;

};

int main()

{

  A  *a=new A ;

      delete  a;

  return 0;

}

例子解析:其中主函数中new为*a分配了8个字节(char *+int),然后构造器为为*name分配了100个字节。所以在析构器中释放的是构造器中分配的空间,即释放100个字节。而主函数中的delete释放的是8个字节,要明白析构器是在对象消失之前调用,所以一切就说的通了,delete a时要先去执行析构器去释放,再去执行delete a。

 

参数列表:在函数声明之后,实现之前,用:开头,x(y)。用此方法对参数进行初始化,效率非常高。【目前不知道为什么,只知道其用法形式】

参数列表的初始化顺序与变量的声明顺序有关,与初始化表中的顺序无关。

class  A

{

public:

      mystring(int a,int b,int c)

      :x(a),y(b),z(c)

      {

      }

private:

    int x;

    int y;

    int z;

C++学习笔记3

标签:

原文地址:http://www.cnblogs.com/Sayer/p/5312250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!