类和对象——构造函数、析构函数、复制构造函数

类:
要声明类,用class,注意区分大小写。类含有成员属性和方法。在声明类的末尾要加分号;
对象:
声明完类之后,它并不能对程序产生任何影响。只有依据类,实例化对象,才可以访问类成员属性和方法。
下面是类实例化对象、动态分配内存与变量的对比:
double pi=3.14;
int* point1= new int[];
delete [] point1;
human woman;
human* point=new human();
delete point;
可以参考:https://blog.csdn.net/yuliu0552/article/details/6795990

构造函数

1 构造函数有多种表示,其在主调函数实例化对象时被使用,可以确保类成员初始化,以避免包含未知的垃圾值。
2 其可以在类声明外定义,也可以在声明类的时候直接定义。
3 构造函数名、析构函数名应与类名一致,
1 重载构造函数
构造函数也可以像一般的函数一样重载,即具有相同的类型和函数名

class human
{ 
private:
string name
int age
public:
human()//默认构造函数
{
 age=0;
cout<<"Default constructor creats an instance human"<<endl;
}
human(string inputname )//重载函数
{
name=inputname;
age=0;
cout<<"overload constructor creats an instance human1"<<endl;
}
human(string inputname,int inputage )//重载函数
{
name=inputname;
age=inputage;
cout<<"overload constructor creats an instance human2"<<endl;
}
};

2 没有默认值的构造函数
如果声明类里面只含有带参量的重载函数,则在主调函数里实例化对象时,应赋予相应的类型的参数。否则会编译出错。

class human
{ 
private:
string name
int age
public:
human(string inputname,int inputage )
   { name=inputname;
    age=inputage;
    cout<<"overload constructor creats an instance human2"<<endl;
    }
    };

3 含有默认值的构造函数
如果声明类里面含有带默认值参量的重载函数,则在主调函数里实例化对象时,应赋予相应的类型的参数,默认值参数可以不给予参量,实例化后输出的为默认值

    class human
    { 
    private:
    string name
    int age
    public:
    human(string inputname,int inputage=10 )
    {  name=inputname;
    age=inputage;
    cout<<"overload constructor creats an instance human2"<<endl;
    }
    };
    //或者时下面的情况
class human
        { 
        private:
        string name
        int age
        public:
        human(string inputname=“alarm”,int inputage=10 )
        {  name=inputname;
        age=inputage;
        cout<<"overload constructor creats an instance human2"<<endl;
        }
        };

4 含有初始化列表的构造函数
初始化时,可以时变量,也可以是固定的值

class human
 { 
  private:
  string name
 int age
public:
human(string inputname=“alarm”,int inputage=10 ):
name(inputname),age(inputage)
    {  
   cout<<"overload constructor creats an instance human2"<<endl;
      }
      ...
      };

析构函数

每当对象不在作用域内,或者是运用delete删除时,即在对象销毁时候,都要调用析构函数。
析构函数没有重载函数。
记录一个错误:C2660:“strcpy_s”: 函数不接受 2 个参数 xigouhanshu e:\c++学习\xigouhanshu\xigouhans。
解决方案为微软的strcpy_s需要三个参数,中间一个是复制元素的大小

strcpy_s(Buffer, strlen(intlatters) + 1,intlatters);
#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;
class mytring
{
private:
	char* Buffer;
public:
	mytring(const char* intlatters)
	{
		cout << "ready to use mystring" << endl;
		if (intlatters != NULL)
		{
			Buffer = new char [strlen(intlatters) + 1];
			strcpy_s(Buffer, strlen(intlatters) + 1,intlatters);
		}
		else
			Buffer = NULL;
	}
	~mytring()
	{
		cout << "Ready to use ~mystring" << endl;
		if (Buffer != NULL)
			delete [] Buffer;
	}
	int getlenth()
	{
		return strlen(Buffer);
	}
	const char* getstring()
	{
		return Buffer;
	}
};

int main()
{
	mytring firstlab("hello");
	cout<<firstlab.getlenth()<<endl;
	cout<<firstlab.getstring()<<endl;
    return 0;
}

输出结果如下:注意这里需要按ctrl+f5运行,否则在你按任意键结束运行后才调用析构函数~mystring()
在这里插入图片描述

复制构造函数

实例化后的对象,如实参一样可以复制给形参,但是,前提是对象所归属的必须含有复制构造函数。
备注:若想要查看指针地址,此处应用:
cout<<hex<<(unsigned int *)Buffer<<endl;

#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;
class mytring
{
private:
	char* Buffer;
public:
	mytring(const char* intlatters)
	{
		cout << "ready to use mystring" << endl;
		if (intlatters != NULL)
		{
			Buffer = new char[strlen(intlatters) + 1];
			strcpy_s(Buffer, strlen(intlatters) + 1, intlatters);
		}
		else
			Buffer = NULL;
	}
	mytring(const mytring & copysource)
	{
		cout << "ready to use mystring" << endl;
		if (copysource.Buffer != NULL)
		{
			Buffer = new char[strlen(copysource.Buffer) + 1];
			strcpy_s(Buffer, strlen(copysource.Buffer) + 1, copysource.Buffer);
		}
		else
			Buffer = NULL;
	}
	~mytring()
	{
		cout << "Ready to use ~mystring" << endl;
		if (Buffer != NULL)
			delete[] Buffer;
	}
	int getlenth()
	{
		return strlen(Buffer);
	}
	const char* getstring()
	{
		return Buffer;
	}
};
void mystringfunction(mytring input)
{
	cout << "read to use mystringfunction" << endl;
	cout << "the length of string2 : " << input.getlenth() << endl;
	cout << "the string is2 :" << input.getstring() << endl;
}
int main()
{
	mytring firstlab("hello");
	cout << "the length of string1:" << firstlab.getlenth() << endl;
	cout << "the string is1 :" << firstlab.getstring() << endl;
	mystringfunction(firstlab);
	return 0;
}

在这里插入图片描述
还有 sizeof在类中的应用:类的size之和属性的类型有关
friend声明友元,让外部函数可以访问私有的属性

猜你喜欢

转载自blog.csdn.net/qq_33713592/article/details/84061981
今日推荐