第一篇博客 C+++知识点总结一
1.成员
1.比较特殊的成员类型:protected.
保护成员在本类中和private类型的成员作用一模一样。区别在于保护成员可以由本类的派生类的成员函数访问,但是私有成员在其派生类中无法访问。
2.成员函数的定义
成员函数如果在类外定义,那么函数声明的参数表可以只写参数类型,但是在类外定义时必须给出参数名。
3.内联成员函数
(1)隐式定义内联成员函数
直接在类内定义的成员函数
(2)显式定义内联成员函数
用关键字inline声明(在声明和定义的语句句子开头加inline),此时可以在类内声明,类外定义。声明、定义都要在句首加inline.
(3)内联函数
内联函数的代码会在编译时插入到每一个调用它的地方。这种做法会提高运行效率。但是只有很简短的代码才实用。
2.对象(成员访问,初始化方式)
1.对象成员的访问方式:
例如对对象d中成员year的访问
d.year (*p).year p->year
2.对象的初始化
(1)
class complex
{
public:
double real; //数据成员是public时才能使用这种方法
double imag;
};
complex c={1.1,2.2};
(2)用构造函数(作用:为对象分配空间,进行初始化)
例如:
...
class complex
{
public:
complex(int a,int b)
{real=a;imag=b;}
private:
double real;
double imag;
};
int main()
{
complex A(1,2);//或者complex *p=new complex(1,2)也可以,不过不需要它时要用delete p;释放
//空间
}
注意:1.构造函数也可以重载。但是调用无参的构造函数时应该 complex A,不能complex A()
2.定义构造函数后,系统将不再提供默认构造函数。所以对于带参数的构造函数,在定义对象时必须给构造函数的形参传值,否则构造函数将不会被执行。
3.but...构造函数可以设置默认参数解决这个问题,例:complex(int a=0,int b=0) 在定义对象时如果complex A;
此时默认值和形参结合,不会出现 2 的情况。注意默认参数必须在构造函数声明时设定。一个程序只能设置一个默认构造函数。:complex(int a=0,int b=0)和complex()只能有一个,不然执行complex A;时会出错。
一般不要同时使用函数的重载和有默认参数的构造函数:complex(int a=0,int b=0);complex(int a);complex s(1)此时会出现二义性。
4.与构造函数对应的有析构函数。没有参数,不能被重载,且一个类只能有一个析构函数。
(3)成员初始化列表
这种方法不在函数体内用赋值语句进行初始化,而是在函数首部实现的
接着上面的例子:...
...
public:
complex(int x,int y):real(x),imag(y)
{ }
...
//或者构造函数在类体外定义时候成员初始化列表也可以
complex::complex(int x,int y):real(x),imag(y)
{ ...}
注意:数据成员是按照在类中声明的顺序初始化的,和在成员列表中的排列顺序无关。
const修饰的和引用类型的数据成员都不能用构造函数直接初始化,只能用成员初始化列表。因为const修饰的数据只能初始化,不能赋值,构造函数中赋值的过程;
优点:主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。
3.对象数组和对象指针
1.对象数组:complex A[3]={
complex(1,1),complex(2,1),complex(2,3)};
2.对象指针:指向对象的指针也可以指向对象数组。
3.this指针
每当创建一个对象的时候,系统就把this指针初始化为指向该对象,即this指针的值是当前调用成员函数的对象的首地址。
例如:执行A.show()就相当于this->show()
4.string类
1.string在C++标注库中已经声明,可以直接定义string类的对象。使用string类对象是程序开头必须加上#include<string>
2.初始化 string str1("china")或者string str1="china"都可以。
3.使用string类可以直接进行基本的运算。
s1=s2 | 赋值 |
s1+=s2 | s1=s1+s2 |
s1+s2 | 合成新串 |
s1==s2 | 判断 |
s1!=s2 | 判断 |
s1<(>\>=\<=)s2 | 判断 |
s1[i] | 访问字符串对象s1中下标为 i 的字符 |
cin>>s1 | 输入输出 |
5.对象作为函数参数
1.对象,对象指针,对象引用都可以作为函数的参数。区别如下:
对象 | 传值调用传递给函数,单行传递,只由实参传递给形参,而不能由形参传回给实参。即在此函数中一定不会影响实参本身。 |
对象指针 | 传址调用,实参形参对象指针都指向同意对象 |
对象引用 | 也可以改变实参 |
跟基本变量做参数的传递规则相同。
6.拷贝构造函数
1.作用:在建立一个新对象时,使用一个已经存在的对象去初始化新对象。
2.特点:
(1)只有一个参数,并且时同类对象的引用。
(2)可以自定义,如果自定义,系统会自动生成一个默认拷贝构造函数。
3.拷贝构造函数的定义,调用用一个例子说明:
...
class point{
public:
point(int a,int b) //普通构造函数
{x=a;y=b}
point(const point &p) //拷贝构造函数的定义格式
{x=2*p.x;y=2.p.y;} //自定义
private:
int x,y;
};
int main()
{point p1(1,2);
point p2(p1);//相当于point p2=p1 构造函数的两种调用形式,拷贝构造函数自动调用。
}
注意:在通常情况下拷贝构造函数能胜任,但如果类中有指针类型时,调用时可能会产生错误。
4.调用拷贝构造函数的三种情况(普通构造函数在对象被创建时候调用)
(1)当用类的一个对象去初始化了另一个对象时
(2)当函数的形参是对象时,实参和形参相结合的时候
(3)但函数的返回值是类的对象。在函数调用完毕,形参对象带回时,此时会调用拷贝构造函数,将此对象赋值给一个临时对象并传到该函数的调用出。//也就是说如果自定义了拷贝构造函数此时返回的对象要小心了。。。
7.静态成员
1.目的:实现一个类的多个对象之间数据共享。
2.静态成员属于类不属于某个对象,在任何对象建立之前就已经存在。
3.用一个例子说明静态数据成员的定义,初始化和调用。
#include<iostream>
using namespace std;
//我家的小猫
class cat{
public:
cat(int x,int y)
{number=x,weight=y;
++count;}
static void disp() //静态成员函数的定义在句子前加static
{cout<<count<<endl;}
private:
int number,weight;
static int count;//静态数据成员的声明 static+数据类型+变量名
};
/* 如果静态成员函数在类外定义
void cat::disp()
{...}
不需要加static */
int cat::count=0;//静态数据成员的初始化,必须在类外,定义该类对象前
int main()
{
cat c1(1,10),c2(2,15);/*如果静态数成员时公有的,它既可以cat::count访问,它也可以像一般成员那样访问*/
c1.disp(); //静态成员函数的调用形式。和静态数据成员类似
c2.disp();
cat::disp();
return 0;
}
4.静态成员的其他知识点
(1)一般情况下静态成员函数用来访问静态数据成员,当一定要访问非静态成员时必须通过对象名访问。
(2)静态成员函数没有this指针。
(3)静态数据成员的使用目的:在建立对象前访问静态数据成员;系统将静态成员函数设置为内部连接,和先行文件链接的其它文件中的同名函数不会和该函数发生冲突,可以维护该函数的安全性。
8.友元
1.友元函数
作用:使得不属于该类的函数可以访问该类的成员。完成一个函数访问多个类的任务。
定义: 就是普通函数,该怎么定义还怎么定义,只不过要在类中声明。形式:friend+正常的声明形式;
一个类的成员函数也可以定义为另一个类的友元函数;在另一个类声明时句首加friend即可。
特殊点: 参数必须是对象名(对象引用等等)。因为他不是类的成员,不能直接访问对象的数据。
2.友元类
实质:当一个类声明为另一个类的友元类,该类的虽有成员函数都是另一个类的友元函数。
特点: 单向并且不可传递
使用方式: 作为友元类的类,在另一个类中声明 friend+友元类名 即可
3.对象成员: 对象也可以作为一个类的成员。和一般变量的定义方法相同。不过有对象成员的类的构造函数定义有所变化,
定义时首句后面要加:对象成员的构造函数(类似成员初始化列表)线调用对象成员的构造函数,再调用类的构造函数。如果在类外定义,声明时不用加:对象成员的构造函数 。在定义有对象成员的类时,要先定义好作为成员的对象。
9.常类型
作用:保证数据共享又防止数据被改动。实际应用中,常用常引用作为参数。用const修饰,实参函数内保护能改变,函数外却可以。
常对象: 数据成员在整个生存期内不允许改变,定义时必须初始化。C++不允许常对象调用普通的成员函数,为了确保不改变数据,只能调用常成员函数。
说明形式: 类名 const 对象名[参数表]; const 类名 对象名[参数表];
常数据成员: 定义时句首加const的数据成员。构造函数只能通过成员初始化列表对其进行初始化。其他任何函数都不能对其赋值。不同对象中的常数据成员可以不同。
常成员函数: 在该函数中一定不会影响数据成员的值。关键字const也可以用来区分函数重载。
定义和声明: 定义和声明时都必须在句末加const,调用时不用加。
特性: 常成员函数可以访问常数据成员也可以访问普通数据成员.(反正都不会改变) ;
常数据成员既可以被常成员函数访问也可以被一般成员访问。(反正不会变);
常对象的数据成员只能够被常成员函数访问;
为了确保常成员函数不改变数据成员的值,不能调用类中的普通成员函数。
第一篇博客 C+++知识点总结一的更多相关文章
- 第一篇博客:Hello World
2016年10月10日,双十,好日子,决定开始写第一篇博客,标题想了会,就叫Hello World 吧,哈哈^_^. 首先感谢博客园的管理们能批准我的申请,记得在14年的时候申请过一次,竟然没申请通过 ...
- 第一篇博客:HTML:background的使用
开篇 我是一名程序员小白,这是我写的第一篇博客,在学习的路上难免会遇到难以解决的问题,我将会在这里写下我遇到的问题并附上解决方法 希望可以对各位有所帮助!! 我们在html中经常会遇到这样的问题 例如 ...
- 我的第一篇博客 ——【ToDoList】小程序开发
我是一只即将大四的大三狗,这是我的第一篇博客,说来惭愧.今年1月份,学校放寒假的时候开始自学的IOS,放假的时候比较起劲,看了一堆Object-C的视频,然后照着中英文对照的IOS基础开发教程,做了两 ...
- Hello World -- 第一篇博客
今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...
- Ginger的第一篇博客
怀着无感的心情,没有技术的身体,写下第一篇博客作为标记. 目前应该会搞清楚数据结构上相关的操作.算法,然后用c语言实现后记录在博客. 我是有目标的咸鱼! 2019/4/19
- “Hello, my first blog”------第一篇博客的仪式感
本人在校大学生一枚,开通博客,主要是想记录自己的学习过程,分享自己的学习经历.记得大一的时候,很多不懂的操作和知识,都是在博客上找到了相应的解决办法.但比较讽刺的是,很多时候,曾经解决了的问题,当再次 ...
- 我的第一篇博客。(JavaScript的声明和数据类型的一些笔记)
这是我的第一篇博客,务必请大家多多关照. 下面是前端js的变量和数据类型的一些笔记,不是很全请多多包涵. 1.变量 变量的声明 var 变量名 变量这个容器中放的是数据 变量的赋值 变量名 = 数据 ...
- 我的第一篇博客:不用sizeof求int的bit数
我的第一篇博客.. 还不会什么高端的东西就来点基础的. 不用sizeof求int的bit数 //不用sizeof求int的bit数 #include<stdio.h> int main( ...
- 第一篇博客 安装open live writer
第一篇博客安装open live writer http://openlivewriter.org/ 有的人可能会打不开,所以我准备了一个百度云的链接地址 链接:https://pan.baidu.c ...
随机推荐
- 常用的GIT
# 初始化相关 git init git add . git commit -m "test001" git remote origin https://github.com/fa ...
- [LC] 692. Top K Frequent Words
Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...
- 62)PHP,提示跳转
由于就是一个普通的页面展示,提示的样式,可以轻松定制! 语法: Header()后的代码会执行,因此在处理好跳转相关操作后,脚本也应该被DIE掉! 案例中实现跳转 封装一个可以完成跳转的方法,需要时, ...
- 76)PHP,session数据区的使用
(1)session数据区: 在我们的session会话结束之前,会有一个seeeion的文件,存储着session序列化的数据,在会话没有结束之前,我们都是操作$_SESSION的,但是在会话结束后 ...
- CSS-----样式表案例(沃顿商学院)之高级山寨版
HTML-CSS设计----------沃顿商学院(高级山寨版) 1.html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...
- Emgu.CV.CvInvoke的类型初始值设定项引发异常”TypeInitializationException”的问题
问题如图: 解决方案: 1.记住EmguCV的安装位置:X:\XXX\XXX… 本测试方案中EmguCV的安装位置:D:\Emgu,操作时记得用自己的EmguCV安装路径替换掉D:\Emgu. 2.添 ...
- SPSS|Data|Transfer|Analysis|Label|One sample test|Testval|Criables|
生物统计与实验设计-使用SPSS Data用于整合:Transfer用于预处理:Analysis用于数据的二维呈现:Label是在报表中呈现的名字: 给离散值编码: 对于离散值做数学计算: 均值比较用 ...
- absorb|state|
ADJ-GRADED 极感兴趣的:专心的:全神贯注的If you are absorbed in something or someone, you are very interested in th ...
- 吴裕雄--python学习笔记:os模块的使用
在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路径进行操作,这就依赖于os模块. 1.当前路径及路径下 ...
- 《JavaScript算法》常见排序算法思路与代码实现
冒泡排序 通过相邻元素的比较和交换,使得每一趟循环都能找到未有序数组的最大值或最小值. 最好:O(n),只需要冒泡一次数组就有序了. 最坏: O(n²) 平均: O(n²) *单项冒泡 functio ...