历经两个月的学习,c++终于学习到了类与对象部分,因为我也学艺不精,所以也写不出什么技术文,只是借此记录一下我最近学到的内容与一些想法来督促自己学习。(主要还是写下来以后看的时候好嘲讽以前还是萌新的自己2333333)
1.类为面向对象的程序设计,可以信息封装的基础。首先,要定义类与对象,用到了一下语句:
class xx
{ pubic:
公有段的数据成员及函数;
protected:
保护段的数据成员及函数;
private:
私有段的数据成员及函数;
};
其中class为定义类时使用的关键字,需要注意的是,在定义时的{}后一定要记得加上“ ; ”。而在类外定义使用成员函数时使用: 返回类型 xx::函数名 (参数表)
例如,我此时定义一个类:
class book
{ public:
int booknumber();
};
当我需要在类外定义其中的成员函数时,语句为:
int book::booknumber()
{
xxxxxxxxxxxxx
}
大致如此。
2.简单的构造函数与析构函数
构造函数与析构函数都是类中特殊的成员函数。构造函数与析构函数都由系统自动调用,不同点在于构造函数在建立类对象时调用,而析构函数在类对象作用域结束时调用。而且在消亡时为先产生的对象后消亡,而且他们都不能被定义在private部分。构造函数的原型为: 类名::类名(参数表); 析构函数的原型为: 类名::~类名();
而当构造函数带参数时,可以用指定的数据来初始化对象的数据成员。下面写一个例子:
class date
{ public:
date(int,int,int);
~date();
void setdate(int y,int m,int d);
void printdate()const;
private:
int year,month,day;
};
date::date(int y,int m,int d)
{
year=y;
month=m;
day=d;
cout<<year<<"/"<<month<<"/"<<day<<" is Taylor's birthday !"<<"\n";
}
date::~date()
{
cout<<"Too late to say happy birthday."<<endl;
}
void date::setdate(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void date::printdate()const
{
cout<<"Today is "<<year<<"/"<<month<<"/"<<day<< endl;
}
int main()
{
date d(1989,12,13);
d.setdate(2017,12,18);
d.printdate();
}
运行结果为:
1989/12/13 is Taylor's birthday!
Today is 2017/12/18
Too late to say happy birthday. //哎呀因为本人是个霉粉,所以就拿我家霉霉举个栗子。。。
所以带参数的构造函数是有这种操作的。
此外还有一个操作叫“复制构造函数”,用于创建对象时用一个已有的同类型对象的数据对其进行初始化。语句为: 类名::类名(const 类名 & 引用名, ...); 但具体的操作我暂时还没有用到,所以暂时不做记录。
3.类中的其他成员
(1)常成员
常成员的定义用const来约束。常成员中又包含常数据成员、常对象、常成员函数等。
对常数据成员而言,既可以通过在构造函数中直接用常量来初始化,也可以用带参数的构造函数来对常数据成员初始化,这里不做太多解释。
常对象则是在定义对象时以const为前缀的对象,需要注意的是,常对象中的数据在作用域中约束为只读,不可修改。这里也不做过多解释。
常成员函数则是以const为后缀的成员函数,这样的成员函数中的数据也是不能修改的。例如之前写到的 int printdate()const; 就是这样的一个成员函数。
这一部分好像相当简单的样子。。。。。
(2)今天刚学到的新知识:静态成员
当类成员以static声明时,就成为了静态成员。之前一直不太明白所谓的“静态”是什么意思,查过之后才知道“静态”指的是其作用域局部与类。(大佬们别笑话我)
在类中,声明static数据成员和其他数据成员一样不会建立储存空间,而且static数据成员储存空间建立不依赖于对象。
静态成员声明时可以放在private里作为私有静态成员,也可以放在public里作为公有静态成员,需要注意的是作为私有静态成员时不能在main函数中直接访问。
而当成员函数以static声明时,就称为静态成员函数。
举个栗子吧:
class x
{
int datmem;
public:
static void abc();
};
此时我要在类外调用静态成员函数
void m()
{
x obj;
x::abc();
obj.abc();
}
对于x::abc();与obj.abc();都是正确的,都可为静态成员函数的入口地址。
不过对于静态成员这部分,我暂时还没有写过具体的程序,关于具体的写法与想法我会在具体掌握之后再做一次补充。