类:
要声明类,用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声明友元,让外部函数可以访问私有的属性