现在的位置: 首页 > 综合 > 正文

C++学习总结

2018年06月08日 ⁄ 综合 ⁄ 共 2053字 ⁄ 字号 评论关闭

1.关于friend

  在类里面声明友元函数时,格式形如friend void GetAge(Student &s); 其中符号&可以要,可以不要,不要的话在函数体里面不能改变值。

  把整个类全部声明到另一个类作为友元类,则那个类的成员函数都可以访问这个类的成员变量。通常需要在最前声明一下类,如:

#include "stdafx.h"
#include <iostream>
using namespace std;
class Student;

class People
{
private:
	int age;
friend class Student;
public:
	People(int a):age(a){};
};
class Student
{
private:
	int age;
public:
	Student(int age_):age(age_){};
	friend void GetAge(Student &s);
	void Show()
	{
		cout<<age<<endl;
	};
	void ShowPeople(People &p)
	{
		cout<<p.age<<endl;
	};	
};

void GetAge(Student &s)
{
	cout<<s.age<<endl;
	s.age = 10;
}
int main(int argc, char* argv[])
{
	People p(9);
	Student s(4);
	GetAge(s);
	s.Show();
	s.ShowPeople(p);
	return 0;
}

2.关于const

  当const修饰的成分有两个内容时,是就近原则。如const int *a = &b;这个语句有两个内容,一个是地址a对应的内容,另一个是指针a,这里const离int *中的int近,所以修饰的是这个指针a所对应的值,其不可以修改,而指针a可以修改。如a = &c;而int *const a = &b;这一个const 离int *中的*近,所以对应的是指针。另外,对于const修饰的内容只有一个时,则const放在类型的前后都一样,如int const d = 10;或者const int d
= 10;都修饰的是d里面的内容。

  当一个变量被const修饰后,作用只是在这个变量,对前面关联的没有影响。如int a = 100;  const int *b = &a;虽然说不能通过*b = xx;来改变a的值,但可以仍然用a = xx来改变值。所以后面的const int *b并没有使前面关联的int a也成const;

  常对象只能调用它的常成员函数。所以如果一个类需要被创建成常对象时,需要对其被调用的成员函数后面加上const:

class Girl
{
private:
	 int age;
public:
	Girl(int a)
	{
		age = a;
	}
	
public:
	void Show() <span style="color:#ff0000;">const</span>
	{
		cout<<age<<endl;
	}
};

  如果一个类里面的成员变量被定义成const那么只能通过构造函数的成员变量初始化列表来完成初始化,且在成员函数中不能修改常变量的值。不过非常成员函数也可以访问常成员变量(对象需不是常对象)。

  在多态性方面,有const的成员函数和没有const的成员函数不是同一个,如:

class Girl
{
private:
	const int age;
public:
	Girl(int a):age(a){}
	
public:
	void Show() 
	{
		cout<<age<<endl;
	}
	void Show() const
	{
		cout<<age+1<<endl;
	}
};

其中常对象调用有const的函数,非常对象调用没有声明是const的函数。不过,如果上面没有常成员函数Show,那么非常对象也可以调用常成员函数。

3.关于声明与定义

  声明不分配空间,定义要分配空间。可以声明多次,但定义只能有一次。如类的定义和声明例子:

#include "stdafx.h"
#include <iostream>
using namespace std;
<span style="color:#ff0000;">class Student;
class Student;</span>

class People
{
private:
	int age;
friend class Student;
public:
	People(int a):age(a){};
};
class Student
{
private:
	int age;
public:
	Student(int age_):age(age_){};
	friend void GetAge(Student &s);
	void Show()
	{
		cout<<age<<endl;
	};
	void ShowPeople(People &p)
	{
		cout<<p.age<<endl;
	};	
};
<span style="color:#ff0000;">class People;</span>
void GetAge(Student &s)
{
	cout<<s.age<<endl;
	s.age = 10;
}

加红的是声明,可以声明多次,但只要后面有了{},就成了定义。

  

抱歉!评论已关闭.