Visual C++可以使用C语言,也可以使用C++语言,对于一些基础性语法C与C++有较大相似性,考虑时间因素,就不深究,
只是将基本的不同点记录一下。
标准库 iostream,包含库的方式include <iostream>
输出cout << " " ;
输入cin >> 变量名;
类的声明
在C++类声明中,类名通常以大写字母C开头,成员变量以“m_”为前缀,这是习惯。
在声明类的方法时,方法的定义可以直接放在类体内,也可以将方法的定义放在定义之外,在声明类时只提供方法的原型。
什么事构造函数?
在建立一个对象之前需要进行初始化工作,类中的属性既然是用来反映一种状态的,那么它应该有确定的值。而在声明类时,
成员变量不可以进行初始化,例如下面的代码就是错误的:
class Pen
{
private:
int m_size=10; //错误,不可以在类中进行初始化赋值
public :
void Write();
int SetSize(int size);
};
当然可以将成员变量的访问权限改写成为public,这样就可以通过类的实践对象进行初始化。但是这样将数据暴露在了外面,
很容易被修改,不符合类的数据封装性。
为了解决这个问题,C++中提供了构造函数(constructor),来处理对象的初始化。
构造函数与一般函数的不同之处在于,构造函数并不是由用户来调用的,而是建立对象是自动执行的,并且构造函数的名称
必须与类的名称一致,而且不能由用户自己命名。
例:构造函数的使用。
// C++构造函数与构析函数.cpp
#include <iostream>
#include "stdafx.h"
using namespace std;
class Pen
{
public :
Pen();
Pen(int size);
int GetSize ();
int SetSize( int size);
void Write();
private :
int m_size;
};
Pen :: Pen( ) //默认构造函数定义
{
cout <<"this is congtructor running"<<endl;
}
Pen :: Pen ( int size ) //构造函数定义,使用::时两个冒号之间不能有空格
{
m_size=size;
Write();
}
void Pen :: Write()
{
cout<<"this size of pen is "<<m_size<<endl;
}
int main ()
{
Pen pen1; //调用默认构造函数
Pen pen2(10); //调用构造函数
return 0;
}
在类声明的Pen()就是这个类默认的构造函数,Pen(int size)是这个类的另一个构造函数。在定义构造函数时也需要加上
类名和“::”作用域修饰符。在主函数中定义一个Pen类的对象pen1时,因为没有为对象传递任何参数,所以调用的是默认构造函数
输出显示一段文字,而在定义pen2时,传递了一个参数10,所以它调用的构造函数时代参数的构造函数,在内部调用Write函数进行
输出显示。
还可以使用参数初始化表,对类中的成员变量进行初始化操作。
class Pen
{
private:
int m_size;
public :
int Pen(int size);
};
Pen::Pen(int size)
{
m_size=size;
Write();
}
将上面使用参数初始化表进行初始化操作:
class Pen
{
private:
int m_size;
public :
int Pen(int size):m_size(size);
};
参数初始化表的含义是,用形参size的值初始化成员变量m_size。
构造函数名称不仅要和类名一致,并且没有返回值。默认构造函数编译器会提供。
默认构造函数
可以使用默认参数的构造函数,在进行初始化时,就对成员变量进行赋值。
// C++构造函数与构析函数.cpp
#include <iostream>
#include "stdafx.h"
using namespace std;
class Pen
{
public :
Pen( int size=10 ); //声明具有默认参数的构造函数
int GetSize (); //成员函数的声明
int SetSize( int size);
void Write();
private :
int m_size;
};
Pen :: Pen ( int size ) //构造函数定义,使用::时两个冒号之间不能有空格
{
m_size=size;
Write();
}
void Pen :: Write()
{
cout<<"this size of pen is "<<m_size<<endl;
}
int main ()
{
Pen pen1; //默认参数的构造函数的调用
pen1.Write();
Pen pen2(15); //参数取代默认参数的构造函数调用
pen2.Write();
return 0;
}
因为在构造参数中指定了默认参数,所以定义没有参数的对象时就会调用带有默认值 的构造函数,这时传递的就是默认参数。
在main函数中如果定义对象时不给出参数美酒使用默认参数,如果给出部分参数,就把前面的参数改变取值,而后面的参数仍取默
认值。
析构函数
析构函数名称与类名相同
一个类中只有一个析构函数,并且该类函数不带任何参数
当撤销对象是系统自动调用析构函数
若没有定义析构函数系统会自动生成析构函数。
析构函数没有参数
析构函数的存在,使每次的运行结果出现了两行。
定义代码如下:
#include "iostream.h"
#include "math.h"
class Point
{
private:
int x;int y;
public :
int distance() //类的成员函数
{
return sqrt(x*x+y*y);
}
point(int a, int b)
{
cout<<"构造函数被调用"<<endl;
x=a;y=b;
}
~point()
{
cout<<"构造函数被调用"<<endl;
}
};
void main()
{
point A (2,3); //定义对象
}
重载构造函数与拷贝构造函数
重载构造函数是指允许在类中有多个构造函数,各个构造函数拥有不同参数个数或参数类型。
class A
{
public:
A();
A(int);
A(int,int);
}
使用有参数的构造函数,必须指定参数值。定义对象时就可以调用相应的构造函数。
拷贝构造函数
拷贝构造函数——依据已经存在的对象建立新的对象。
函数名称和类名一样。
每个类都有一个拷贝构造函数,如果程序中没有显示,编译系统会自动生成。
拷贝构造函数有一个参数,是对类的对象的引用。
#include "iostream.h"
#include "math.h"
class Point
{
private:
int x;int y;
public :
int distance() //类的成员函数
{
return sqrt(x*x+y*y);
}
point(int a, int b)
{
cout<<"构造函数被调用"<<endl;
x=a;y=b;
}
point(const point &p)
{
x=2*p.y;y=2*p.x;
}
};
void main()
{
point A (2,3); //定义对象
point B(A);
cout <<A.distance()<<" "<<B.distance()<<endl;
}