c++语法——类和对象的学习(1)

本文链接 http://write.blog.csdn.net/postedit?ref=toolbar&ticket=ST-6262-v990WQgRcxAKyorqtsRF-passport.csdn.net

c++语法学习,先从类和对象开始吧。总结今天的学习内容,写最最简单的类。

第一个类的代码参考:http://jingyan.baidu.com/article/cd4c2979ec4106756e6e60be.html  自己做了修改。

Image.h 文件 , Image类的声明:

#ifndef Image_H
#define Image_H

#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

class Image
{
public:
	Mat imageRead(string s);
	void imageSave(string s, Mat m);
	void imageShow(string s, Mat m);
	Mat& operator=(Mat m);  //Mat& 是什么数据结构? operator是什么值?
	void imageInfo(Mat m);
	Mat get();
protected:
private:
	Mat m_srcImage;
	Mat m_saveImage;
};

#endif
.cpp 文件 Image类的定义

#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

#include "a.h"

Mat Image::imageRead(string s)
{
	m_srcImage = imread(s);
	return m_srcImage;	 
}

void Image::imageSave(string s, Mat m)
{
	m_saveImage = m;
	imwrite(s, m_saveImage );
}

void Image::imageShow(string s, Mat m)
{
	m_srcImage = m;
	imshow(s, m_srcImage);
}

void Image::imageInfo(Mat m)
{
	cout<<m.channels()<<endl;	
}

Mat Image::get()
{ 
	return m_srcImage;
}

.cpp 文件,main函数入口

#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

#include "a.h"

int main()
{
        Image im;
	//im.m_srcImage = im.imageRead("1.jpg");  //不能直接调用类的私有成员变量
	im.get() = im.imageRead("a.bmp");
	im.imageShow("a",im.get());
	Mat gray;
	cvtColor(im.get(), gray, CV_BGR2GRAY);
	im.imageSave("gray.bmp", gray);
	im.imageInfo(gray);

	while(true)
        {
	    int c;
	    c = waitKey( 20 );
	    if( (char)c == 27 )
	        { break; }
        }
	return 0;
}
原文目的是回答:c++中访问私有成员变量的方法有哪些?

最简单的类总是把成员变量写在private里面,在public里面写一些成员函数。私有成员变量只能在类内使用,对象不能直接调用,那怎么调用呢?

main()函数中 

im.m_srcImage = im.imageRead("a.bmp");
这一句会报错,m_srcImage不可访问。这一句本来的目的是调用imageRead()函数,将图片读进来装在m_srcImage中。

一种办法是给类定义一个公有的get()接口用来访问类的私有变量:

public:
    Mat get() { return m_srcImage};
main()函数中调用:
im.get() = im.imageRead("a.bmp"); //im.get()函数返回的就是m_srcImage.这样入读的图片就可以装在m_srcImage变量中了,也就是im.get()这个Mat容器中有内容了。
一开始我是这样写的:

Mat Image::imageRead(string s)
{
	Mat src = imread(s);
	return src;	 
}
报错:


意思是im.get()里面根本没有数据。我以为只要公有函数返回了一个值就可以用了,但是不行,必须返回的是成员变量。

另外, main.cpp文件只包含了Image.h, 没有包含Image.cpp。尝试加上#Image.cpp就报错。找了网络上的一种回答:

http://zhidao.baidu.com/link?url=CkiUB8PlNi4R4w3QwuUR2LSkXy5bJtkhWIEDU58IvBfXEJsGRmXZXH9bCpURzLCIAi36jqxsYXI-ZFIP4qL-4q

        在Image.cpp里面加入#include"Image.h",是为了把"Image.h"里面的声明引用进来,不然会出现很多警告说你这也没定义,那也没定义。如常用的程序要使用cout,cin来实现输出输入,就必须加#include<iostream>一样 编译器在编译期间会自动把需要的东西加到cpp里面来,没有这句或者你没有其他语句告诉编译器该去哪找 cout/cin ,编译时编译器就认为他们没定义。
        .h对应的.cpp和名称无关。

    .h里有类声明,然后连接器看哪个cpp里包含你的头文件,然后再去里面找类的实现。

下面是第二个最最简单的类

Time.h:  Time类的声明

class Time
{
public:
	Time(int aHour=0, int aMin=0, int aSec=0); //所有参数都带有默认值的构造函数,默认构造函数
	//Time(int m_iHour=0, int m_iMin=0, int m_iSec=0); //类里面的任何成员变量在定义时是不能初始化的。
	void setHour(int aHour); //重新设置时
	void setMin(int aMin);   //重新设置分
	void setSec(int aSec);   //重新设置秒
	int getHour();  //获取时,该函数返回当前m_iHour的值
	int getMin();
	int getSec();
	void display();

private:
	int m_iHour;
	int m_iMin;
	int m_iSec;
};

Time.cpp:Time类的定义

//用初始化列表初始化类中数据成员,
Time::Time(int aHour, int aMin, int aSec):m_iHour(aHour),m_iMin(aMin),m_iSec(aSec)
{

}
//aHour, aMin,aSec是什么?是常量?是变量?----是常量,.h已经定义了int aHour=0, int aMin=0, int aSec=0
//也不对,是变量,在对象初始化的时候可以自定义值,然后它们就成为常量了。
//初始化列表:Time::Time():m_iHour(0),m_iMin(1),m_iSec(2); 
//类外初始化:int Time::m_iHour=0;


//成员函数定义
void Time::setHour(int aHour)
{
	m_iHour = aHour;
}

void Time::setMin(int aMin)
{
	m_iMin = aMin;
}

void Time::setSec(int aSec)
{
	m_iSec = aSec;
}

int Time::getHour()
{
	return m_iHour;
}

int Time::getMin()
{
	return m_iMin;
}

int Time::getSec()
{
	return m_iSec;
}

void Time::display()
{
	cout<<m_iHour<<":"<<m_iMin<<":"<<m_iSec<<endl;
}
main.cpp 

int main()
{ 
        Time t1;
	t1.setHour(3);
	t1.setMin(40);
	t1.setSec(30);
	t1.display();

	Time t2(7,30,20);
	t2.display();
	cout<<t2.getHour()<<"."<<t2.getMin()<<"."<<t2.getSec()<<endl;
}
公有的类成员函数主要有两种,分别是修改和获取私有成员变量。

另外多了一个构造函数:

public:
	Time(int aHour=0, int aMin=0, int aSec=0); //所有参数都带有默认值的构造函数,默认构造函数
在.cpp里面还有构造函数的初始化:

//用初始化列表初始化类中数据成员,
Time::Time(int aHour, int aMin, int aSec):m_iHour(aHour),m_iMin(aMin),m_iSec(aSec)
{

}
关于构造函数的概念参考了: http://blog.csdn.net/tiantang46800/article/details/6938762

构造函数的作用:初始化对象的数据成员。

新建一个对象之后,就要对成员函数初始化。




你可能感兴趣的:(C++)