ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 学习笔记 (1)

2021-01-22 03:01:04  阅读:123  来源: 互联网

标签:10 struct int 笔记 学习 默认 C++ class


1.引用 

引用必须指向一个指向一块合法的内存空间,不可以指向一个常数。例如

int  & ref = 10; 这个用法是错的,因为10不是一个合法的内存空间,它在常量区

const int & ref = 10;这个用法是正确的。加上const之后,编译器将代码 修改为 int temp = 10; int & ref = temp;

ref = 20; 加入const之后变为只读,是不可以修改的

 

2.函数点位参数

C++ 中函数的形参列表可以有点位参数,用来点位,调用函数时必须填补该位置 

语法 :返回值类型 函数名 (数据类型){}

例子:

 void func(int a,int)   //后面的参数只有类型,没有变量,点位参数也可以有默认值 ,例如 void func(int a, int =10)

{

  count<< "this is func" << endl;

}

 int main()

{

  func(10,10);

  system("pause");

}

 

 

3. 函数重载

 函数重载满足条件:

  同一个作用域下

  函数名称相同 

  函数参数类型不同 或者 个数不同 或者顺序不同

  注意:函数的返回值不可以作为 函数重载的条件 

3.1 函数重载注意事项

  A、引用作为 重载条件:例如

     void func(int &a)  // int &a = 10; 不合法  调用方式 为:int a = 10; func(a) 

     {

      count << “func(int &a)” << endl;

     }

 

     void func(const int &a) //const int &a = 10;合法 调用 方式为:func(10)

     {

      count << “func(const int &a)” << endl;

     }

  这两个方法是符合重载条件的,但是在调用的时候 一定要注意

 

  B、函数重载碰到函数默认参数

     void func(int a,int b = 10)  //

     {

      count << “func(int &a)” << endl;

     }

 

     void func(int a) //

     {

      count << “func(const int &a)” << endl;

     }

  当调用这两个方法中的一个的时候,例如 func(10),当函数重载碰到默认参数,出现二义性,会报错,尽量避免这种情况

 

4. struct 和 class的区别

  C++ 中,struct 和 class 的区别就在于默认的访问权限不同

  区别:

    struct 默认权限为公共

    class 默认权限为私有

4.1、首先比较一下C中的结构体和C++中的结构体区别

C++中的struct是对C中的struct进行了扩充,所以增加了很多功能,主要的区别如下图所示:

在这里插入图片描述
上面罗列了在声明时的区别,在使用的过程中也有区别:

在C中使用结构体时需要加上struct,或者对结构体使用typedef取别名,而C++可直接使用,例如:

结构体声明,C和C++使用同一个
struct Student
{
	int  iAgeNum;
	string strName;
}
typedef struct Student Student2;//C中取别名

struct  Student  stu1;	//C中正常使用
Student2   stu2;		//C中通过取别名的使用
Student    stu3;		//C++使用

 

C与C++实际上编程思想的区别,C是面向过程,C++面向对象。
所以在C中结构体就是不同类型数据的集合,并不涉及算法和操作。
而C++是把数据变量及对这些数据变量的相关算法和操作给封装起来。

4.2、C++中Struct与Class的区别

在C++中引入struct是为了保持对C程序的兼容,在引入之后C++对其进行了扩充,现在struct可以拥有静态成员、成员数据可进行初始化、拥有函数、也可以继承、甚至多态也支持。从表面看起来两者之间像是没有区别,有时你把程序中的所有class改为struct,程序也照常运行。之所以说是看起来呢,两者之间肯定还是有差别的啦。

4.2.1、内部成员变量及成员函数的默认防控属性

struct默认防控属性是public的,而class默认的防控属性是private的,例如:

struct A
{
	int iNum;
}
class B
{
	int iNum;
}

A a;
a.iNum = 2;		//没有问题,默认防控属性为public
B b;
b.iNum = 2;		//编译出错,默认防控属性为private

 

4.2.2 继承关系中默认防控属性的区别

在继承关系,struct默认是public的,而class是private,例如:

struct A
{
	int   iAnum;
}
struct B : A
{
	int   iBnum;
}

A a;
a.iAnum = 1;	//在struct情况下是正确的,在class情况下是错误的

 

在是struct的情况下B是默认public继承A的。如果将上面的struct改成class,那么B是private继承A的。

上面的列子都是struct继承struct,class继承class,那么class与struct继承会怎样呢?
结论是:默认的防控属性取决于子类而不是基类,例如:

struct A{};
class B : A {};	//默认为private继承
struct C : B{};	//默认为public继承

所以我们在写代码的时候,为了不引起歧义,最好指明继承的方式,而不要用默认的继承,例如:

class B : public A{};
struct B : public A{};

4.2.3、模板中的使用

class这个关键字还可用于定义模板参数,就像typename。但是strcut不用与定义模板参数,例如:

template< typename T, typename Y >	//可以把typename 换成 class
int  Func( const T& t, const Y& y )
{
	//TODO
}

 

4.2.4、{}赋初值的讨论

因为C++是对C的扩充,那么它就兼容过去C中struct的特性,例如:

struct A
{
	char 	c1;
	int		i2;
	double	db3;
};

A a = {'p', 7, 451.154}; //定义时赋初值,在struct时没问题,在class时出错

 

当然这里在class时,默认的防控属性为private,所以出错正常,但这是它们之间的一个区别吗?不是的。
在struct中加入一个构造函数(或虚函数),你会发现struct也不能用{}赋值了。嗯?头顶上有个大大的问号。

原因是以{}的方式来赋初值,只是用一个初始化列表来对数据进行按顺序的初始化,如果上面写成A a = {‘p’,7};则c1,i2被初始化,而db3没有。这样简单的copy操作,只能发生在简单的数据结构上,而不应该放在对象上。加入一个构造函数或是一个虚函数会使strcut更体现出一种对象的特性,而是{}操作不在有效。

因为加入这样的函数(构造和虚函数),使得类的内部结构发生了变化。而加入一个普通的成员函数呢?你会发现{}依旧可用。其实你可以将普通的函数理解成对数据结构的一种算法,这并不打破它数据结构的特性。

 

4.2.5总结

通过上面的总结,你会发现两者的差别确实没有很大。尤其是在我们书写程序的过程中显示指明防控属性时,那我们什么时候用class,什么时候用struct呢?

个人建议:当你觉得你要做的更像是一种数据结构集合的话,那么用struct。如果你要做的更像是一种对象的话,那么用class。

 

标签:10,struct,int,笔记,学习,默认,C++,class
来源: https://www.cnblogs.com/baizhou168/p/14311344.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有