c++中的const权限及static成员及友元

目录

c++中的const权限

 const的修饰规则

成员函数调用const成员函数

static成员

计算一个类中产生了多少对象

static修饰成员函数

对象创建+static成员函数的练习

初始化列表

类中包含以下成员,必须放在初始化列表位置进行初始化:

类中成员的声明

 友元

友元函数

友元类

内部类


c++中的const权限

void Print()
{
	cout << _year << "-" << _mouth << "-" << _day << endl;
}
void f(const Date& d)
{
	d.Print();
}

this指针为非const的,故需要

//void Print(const Date* this)
void Print() const
{
	cout << _year << "-" << _mouth << "-" << _day << endl;
}

 const的修饰规则

//const在*前  修饰指针指向的内容   *后修饰指针本身
//const Date* p1;  *p1
//Date const* p2;  *p2
//Date* const p3;  p3

成员函数调用const成员函数

void f1()//void f1(Date* this)
{
	f2();//this->f2(this);  正确
}
void f2() const
{}
//
void f3()
{}
void f4() const //void f4(const Date* this)
{
	f3();//this->f(this);     错误
}

static成员

计算一个类中产生了多少对象

#include<iostream>

using namespace std;

int n = 0;
class A
{
public:
	A()
	{
		++n;
	}
	A(const A& a)
	{
		++n;
	}
};
A f1(A a)
{

	return a;
}
int main()
{
	A a1;//对象是由构造函数或拷贝构造产生的
	A a2;

	f1(a1);
	f1(a2);
	cout << n << endl;
	return 0;
}

6个对象 

A& f1(A& a)
{

	return a;
}

2个对象

private:
	static int n;//声明  n属于这个类的所有对象
int A::n = 0;//定义

提高代码的封装性。

static修饰成员函数

	static int GetN()
	{
		//_a = 10;
		return n;
	}
private:
	int _a;

没有this指针不能访问非静态成员。

static成员

1.static成员变量不存在对象中,存在静态区,属于这个类的所有对象,也是属于这个类。

2.static成员函数,没有this指针,不使用对象就可以调用。调用方式->类名::func();

 3.static函数中,不能访问非静态成员(变量+函数)

void f1()
{}
static void f2()
{
	//f1();
}
void f3()
{
	f4();
}
static void f4()
{
	//f1();
}

1. 静态成员函数可以调用非静态成员函数吗?

x     静态成员函数无this指针

2. 非静态成员函数可以调用类的静态成员函数吗?

对象创建+static成员函数的练习

求1+2+3+...+n_牛客题霸_牛客网求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、swit。题目来自【牛客题霸】icon-default.png?t=N7T8https://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1?tpId=13&tqId=11200&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

class Sum
{
public:
    Sum()
    {
        sum+=i;
        ++i;
    }
    static int GetSum()
    {
        return sum;
    }
private:
    static int i;
    static int sum;
};
int Sum::i=1;
int Sum::sum=0;
class Solution {
public:
    int Sum_Solution(int n) {
        Sum s[n];
        return Sum::GetSum();
    }
};

初始化列表

类中包含以下成员,必须放在初始化列表位置进行初始化:

引用成员变量

const成员变量

自定义类型成员(该类没有默认构造函数)


突破类域的两种方式  编译时可以知道去那个域找+访问限定符是否可以访问

编译时可以知道去那个域找

对象.方法

类名::(域作用限定符)方法

类中成员的声明

private:
    static int i;
    static int sum;

类里面均为声明。

静态成员变量只能类里面声明,类外面定义。

//c++11-------------->声明时给缺省值。
int _a=0;

初始化只能发生在定义时。

static int n;

静态的不允许。规定:静态成员应在类外定义。

B b = 20;

涉及隐式类型转换

int* p = (int*)malloc(4);

 友元

友元分为:友元函数和友元类

类外面访问私有或保护成员的一种方式。

友元函数

void operator<<(ostream& out)
{
	cout << _year << "/" << _mouth << "/" << _day << endl;
}
Date d1;
d1.operator<<(cout);
d1 << cout;

代码可读性差。

class Date
{
	friend ostream& operator<<(ostream& out, const Date& d);
public:
	
private:
	int _year=0;
	int _mouth=1;
	int _day=1;
};
ostream& operator<<(ostream& out,const Date& d)
{
	cout << d._year << "/" << d._mouth << "/" << d._day << endl;
	return out;
}
Date d1;
cout << d1 ;

cout是标准库std命名里的一个ostream类型的全局对象.

<<是一个运算符。

友元类

class Time
{
 friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成
员变量
public:
 Time(int hour, int minute, int second)
 : _hour(hour)
 , _minute(minute)
 , _second(second)
 {}
 
private:
 int _hour;
 int _minute;
 int _second;
};
 
class Date
{
public:
 Date(int year = 1900, int month = 1, int day = 1)
 : _year(year)
 , _month(month)
 , _day(day)
 {}
 
 void SetTimeOfDate(int hour, int minute, int second)
 {
 // 直接访问时间类私有的成员变量
 _t._hour = hour;
 _t._minute = minute;
 _t.second = second;
 }
 
private:
 int _year;
  int _month;
 int _day;
 Time _t;
};

内部类

class A
{
private:
 static int k;
 int h;
public:
 class B
 {
 public:
 void foo(const A& a)
 {
 cout << k << endl;//OK
 cout << a.h << endl;//OK
 }
 };
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值