C++之const

目录

笔试题考点:

const作用:

1.const可以定义常量

2.const可以定义指针

3.const可以修改函数形参--提高程序的可读性和健壮性

笔试题考点:

4.const可以修饰成员函数--放在函数参数外面---常成员函数--在此函数中不能修改本类数据成员的值

5.const可以修饰函数返回值---返回值为引用才有意义

6.假设只想输出m_i或者m_j中的一个

7.思考--想在主函数中修改m_i的值 

笔试题考点:

构造函数除了能构造对象还可以用作类型转换\n\n当前构造函数中整形作为函数参数,所以可以用一个整型去对对象进行初始化

A b=7;//用7初始化b

class A
{
public:
	A():m_i(NULL)
	{}
	A(int i) :m_i(i)
	{
		cout << "A" << i << endl;
	}//构造函数可以用作类型转换,将int转换为类对象 A b
	
	void print()
	{
		cout << m_i << endl;
	}
private:
	int m_i;
};

void main()
{
	A c();//声明函数c,无参,返回类型为A
	A d;//如果要定义无参对象,那么一定不能带()
	A a(5);//调用了构造函数
	A b = 7;//调用了构造函数,用7初始化b,
	a.print();
	//b.print();
}

A c();//声明函数c,无参,返回类型为A
A d;//如果要定义无参对象,那么一定不能带()//调用的是 A():m_i(NULL){}
A a(5);//调用了构造函数A(int i) :m_i(i)
A b = 7;//调用了构造函数,用7初始化b,
a.print();//打印函数

explicit A(int i) :m_i(i)
	{
		cout << "A" << i << endl;
	}//加了一个限定符(explicit:明确,确定)

限定符:explicit,明确了构造函数只能构造对象,不允许转换类型

添加了explicit(限定符):目的是消除改类型的转换写法;修改构造函数

A b = 7;//调用了构造函数,用7(int类型)初始化b(A类型),将A类型加上限定符,这句话错误

const作用:

在C中是只读,在C++中是常量

1.const可以定义常量

const int a = 10;必须在声明的时候初始化

void main()
{
	const int a = 9;
	a = 10;//error
	const int a = 10;//ok
}

2.const可以定义指针

  指针本身
  指针所指向的内容

void main()
{
	int a = 10;
	cout << "a修改前" << a << endl;

	const int* p1 = &a;//p1本身是指针变量,所指向的内容不能修改
	int const* p2 = &a;//同上
	int* const p3 = &a; //const修饰p3本身
	const int* const p4 = &a;//p4本身和所指向内容都不能修改
	

	cout<<"*p1"<< * p1 << endl;
	cout<<"a当前的值"<<a << endl;

	//(*p1) = 60;//error,*p1所指向的内容即就是a不能改变
	cout << "p1" << p1 << endl;
	p1++;
	cout << "p1" << p1 << endl;
	
    //p3++;//error,p3被const修饰,即就是本身不能改变
	cout << "*p3" << *p3 << endl;
    cout<<"a当前的值"<<a << endl;
	(*p3)++;
	cout << "*p3" << *p3 << endl;
    cout<<"a当前的值"<<a << endl;
	
    //p4++;//error
	//(*p4)++;//error
    //p4是前三个的并集都不能改变
}

const int* p1 = &a;//p1本身是指针变量,所指向的内容不能修改(*p1)
int const* p2 = &a;//同上
int* const p3 = &a; //const修饰p3本身(p3不能改变)
const int* const p4 = &a;//p4本身和所指向内容都不能修改(*p4和p4)


3.const可以修改函数形参--提高程序的可读性和健壮性

int strcmp(const char*str1,const char*str2)
char *strcpy(char *dest,const char*src)

笔试题考点

char *strcpy(char *dest,const char*src),第一个参数dest代表的是目的字符串的首地址,为什么还需要函数返回值?

---实现链式表达式

char *strcpy(char *dest,const char*src)
cout<<strlen(strcpy(p,"123456"))<<endl;//实现链式表达,一步求出p的长度

void mystrcpy(char *dest,const char*src);
strcpy(p,"123456");//无返回值,只能实现字符串拷贝
strlen(p);//在我求出长度


4.const可以修饰成员函数--放在函数参数外面---常成员函数--在此函数中不能修改本类数据成员的值

一般情况下,将get函数,打印函数等这类函数设置为const
   int get()const{}

class A
{
public:
	A(int i = 0, int j = 0) :m_i(i), m_j(j), m_k(0), m_m(0) {}
	void Print()const
	{
		m_i = 10;
		cout << m_i << " " << m_j << " " << m_k << " " << m_m << endl;
	}
	//	int GetI()const //常成员函数,在当前函数中不能修改本类数据成员的值,即是在当前函数中不能修改m_i和m_j
	//	{
	//	    m_i = 10;//error 在此函数中不能修改
	//		return m_i;
	//	}
	int GetJ()const //常成员函数
	{
		return m_j;
	}

private:
	mutable int m_i;//如果变量过多,想要修改个别变量可在前加mutable
	int m_j;
	int m_k;
	int m_m;
};
void main()
{
	A a(4, 7);
	//cout<<a.m_i<<a.m_j<<endl; //error m_i,m_j是private
	//假设只想输出m_i或者m_j中的一个
	//cout<<"a.m_i = "<<a.GetI()<<endl;
	a.Print();
}

int GetI()const //常成员函数,在当前函数中不能修改本类数据成员的值,即是在当前函数中不能修改m_i
{
        m_i = 10;//error 在此函数中不能修改
        return m_i;

 }


5.const可以修饰函数返回值---返回值为引用才有意义

class A
{
public:
	A() {}
	void fn()const
	{
		cout << "fn const" << endl;
	}
	void fn()
	{
		cout << "fn" << endl;
	}
};
void main()
{
	const A a;
	A b;
	a.fn();
	b.fn();
}

6.假设只想输出m_i或者m_j中的一个

class A
{
public:
	A(int i = 0, int j = 0) :m_i(i), m_j(j) {}
	void Print()const
	{
		cout << m_i << " " << m_j << endl;
	}
	int GetI()
	{

		return m_i;
	}
	int GetJ() 
	{
		return m_j;
	}

private:
	int m_i;
	int m_j;

};
void main()
{
	A a(4, 7);
	//cout<<a.m_i<<a.m_j<<endl; //error m_i,m_j是private
	//cout<<"a.m_i = "<<a.GetI()<<endl;
	a.Print();
	cout << "m_i "<<a.GetI() << endl;
	cout << "m_j "<<a.GetJ() << endl;
}

7.思考--想在主函数中修改m_i的值 

class A
{
public:
	A(int i = 0) :m_i(i) {}
	void Print()
	{
		cout << "m_i = " << m_i << endl;
	}
    //以下分类讨论
    int GetI()
	{
		return m_i;
	}
	int& GetI_1()
	{
		return m_i;
	}
	const int& GetI_2()
	{
		return m_i;
	}
private:
	int m_i;
};

void main()
{
	A a(6);
	a.Print();
	//a.m_i = 7;//error//只能作为右值
	//a.GetI() = 7;
	cout << "修改后" << endl;
	a.GetI_1() = 7;
	a.Print();
	cout << "m_i:"<<a.GetI_2() << endl;
}

//error只能作为左值不能修改

	int GetI()//只能作为右值
	{
		return m_i;
	}
	

//ok//返回的是m_i本身,通过a.GetI_1() = 7;改变

int& GetI_1()  //返回的是m_i本身
{		
    return m_i;
}
	

//error//返回本身,不能修改

const int& GetI_2()//(返回本身的情况下又不能修改)
{
    return m_i;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值