C++面向对象 class three

  • 定义对象时如果没有参数,不需要加括号。
  • 关于带默认值的函数:比想象中功能强大,在使用的时候同样可以带参数,但是参数必须是从左向右传递的,这样有时候只需要一个带默认值的构造函数就可以同时实现不带参数(默认)与带参数时的需求,同时也体现了函数重载的意义所在。
  • 常成员:作用于对象。
  • 静态数据成员:作用于类,这个类的各个对象共享,用于定义类的常数,还可用于这个类产生了多少个对象。
  • 静态成员函数:类似于静态成员变量,整个类共享,几个使用注意的点详见代码2。
  • 引用的新理解:在传递参数时使用引用不是将对象的所有成员穿了进去,而是通过这个“别名”访问那个对象,有点指针的感觉。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

class Person{//要有一个构造函数包含初始构造函数
public:
    Person(string name,int id):_id(id){//成员初始化列表,参数表一样
        _name = name;
        numOfPerson++;
    }//常成员和对象成员还有子类对父类成员的初始化只能通过成员初始化列表初始化
    Person(Person &another):_id(another._id)//拷贝构造函数
    {
        _name=another._name;
        numOfPerson++;
    }
    ~Person()
    {
        numOfPerson--;
    }
    static void getNumOfPerson()//静态成员函数
    {
        cout<<numOfPerson<<endl;
    }
    Person(int id=0);//再类里面定义的函数都是内联函数,如果不作为内联函数,在外面定义,里面声明
    //只是参数带了默认值不构成重载
    void output() const;//常函数,不允许修改类的成员,即使不是常成员
    //常函数和不是常函数的普通函数可构成重载
private:
    string _name;
    const int _id;//常数据成员,一旦给了不可改变,只能在构造函数通过成员初始化列表给定
    static int numOfPerson;//静态数据成员,在定义体外面初始化;
};

int Person::numOfPerson = 0;//静态数据成员初始化
//注意:静态数据成员的初始化在类体外进行,前面不加static以免与一般静态变量或者对象混淆。
void Person::output() const{//::预限定符,全局函数
    cout<<"name: "<<_name<<endl;
    cout<<"id: "<<_id<<endl;
}
inline Person::Person(int id):_id(id)//可用inline,定义内联函数
{                                    //如果有默认值,默认值只在声明时出现,定义时不出现
    _name = " ";
    numOfPerson++;
}
//inline:可用于在类外面定义内联函数
int main()
{
    int a=10;
    int b=50;
    const int *p;//p是指针,指向的值看成常数
    int const *q;//与p相同,不能改变指向的值,但可以改变指向谁
    int *const r=&a;//r本身是常数,需在定义时指向,*与const的位置决定了r是什么
    //r不能改变指向,但是可以改变指向的值
    const int *const t = &a;//指向常量的常量指针,同时具有以上两个特点
    p=&a;
    q=&a;
    a=20;
    p=&b;
    cout<<*p<<endl<<*q<<endl<<*r<<endl;
    const Person p2("Lisa",345);//常对象,数据成员不能修改
    //常对象只能调用常成员函数!
    string s1;
    int s2;
    cin>>s1>>s2;
    Person person1(s1,s2),person2(person1);
    person1.output();
    person2.output();
    person2.getNumOfPerson();
    person2.~Person();
    person1.getNumOfPerson();
    return 0;
}


  • 代码2:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
class Clock{
public:
	Clock(int hour,string pai):_pai(pai){
		_hour=hour;
		numOfClock+=hour;
	}
	Clock(string pai=" "):_pai(pai){
		_hour =3;
		numOfClock+=_hour;
	}
	
	static void showNum()
	{
//		cout<<_hour<<endl;//静态成员函数不能访问非静态成员 ,只能访问静态成员变量 
		cout<<numOfClock<<endl;
	}
	
private:
	int _hour;
	const string _pai;
	static int numOfClock;
}; 
//错误!类的静态数据成员是静态存储,它是静态生存周期,必须进行初始化,也就是不能先声明,然后外面定义 
//static void Clock::showNum()
//{
//	cout<<numOfClock<<endl;
// } 
int Clock::numOfClock = 0;
int main()
{
	Clock c1(5,"sd");
	c1.showNum();
	Clock c2;
	c2.showNum();
	Clock::showNum();//静态成员函数可以通过类直接访问,普通成员函数不能 
	return 0;
	
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈希表扁豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值