热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++入门必备:首个博客知识点汇总

本文总结了C++初学者需要掌握的关键知识点,特别强调了成员类型的区分。其中,protected成员与private成员在本类中的作用相同,但protected成员允许派生类的成员函数访问,而private成员则不允许。此外,文章还介绍了其他重要的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

      2.初始化 string str1("china")或者string str1="china"都可以。

      3.使用string类可以直接进行基本的运算。





































s1=s2赋值
s1+=s2s1=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
using namespace std;
//我家的小猫
class cat{
public:
cat(int x,int y)
{number=x,weight=y;
++count;}
static void disp() //静态成员函数的定义在句子前加static
{cout< 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,调用时不用加。

                           特性: 常成员函数可以访问常数据成员也可以访问普通数据成员.(反正都不会改变) ;

                                      常数据成员既可以被常成员函数访问也可以被一般成员访问。(反正不会变);

                                      常对象的数据成员只能够被常成员函数访问;

                                       为了确保常成员函数不改变数据成员的值,不能调用类中的普通成员函数。

                        


推荐阅读
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • HDU1176:免费馅饼问题的动态规划解法分析
    题目“免费馅饼”通过动态规划方法进行了解析。该问题的时间限制为 Java 2000ms 和其他语言 1000ms,内存限制为 Java 65536K 和其他语言 32768K。本文详细探讨了如何利用动态规划算法高效求解此问题,并对算法的时间复杂度和空间复杂度进行了深入分析。此外,还提供了具体的实现步骤和代码示例,帮助读者更好地理解和应用这一方法。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 题目链接:POJ 2777。问题描述:给定一个区域,需要进行多次涂色操作,并在每次操作后查询某个区间内的不同颜色数量。解决方案:由于题目中颜色种类不超过30种,可以利用线段树的懒惰更新策略来高效处理这些操作。通过懒惰标记,避免了不必要的节点更新,从而显著提高了算法的效率。此外,该方法还能有效应对大规模数据输入,确保在合理的时间内完成所有操作。 ... [详细]
  • 利用 Spring BeanUtils 实现 JavaBean 的深度克隆与属性复制 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 在Python网络编程中,多线程技术的应用与优化是提升系统性能的关键。线程作为操作系统调度的基本单位,其主要功能是在进程内共享内存空间和资源,实现并行处理任务。当一个进程启动时,操作系统会为其分配内存空间,加载必要的资源和数据,并调度CPU进行执行。每个进程都拥有独立的地址空间,而线程则在此基础上进一步细化了任务的并行处理能力。通过合理设计和优化多线程程序,可以显著提高网络应用的响应速度和处理效率。 ... [详细]
  • 虚拟机网络设置与数据库远程连接优化指南
    本文针对个人计算机上虚拟机网络配置与数据库远程连接的问题,提供了一套详细的优化指南。在探讨远程数据库访问前,需确保网络配置正确,特别是桥接模式的设置。通过合理的网络配置,可以有效解决因虚拟机或网络问题导致的连接失败,提升远程访问的稳定性和效率。 ... [详细]
  • 为了向用户提供虚拟应用程序,通常会在基础架构中部署StoreFront或Web Interface。为了确保安全的远程访问,通常需要在DMZ中配置Secure Gateway或Access Gateway。本文详细对比了这两种界面工具的功能特性,包括用户管理、安全性、性能优化等方面,为企业选择合适的解决方案提供了全面的参考。 ... [详细]
  • 理解和应用HTTP请求中的转发与重定向机制
    在HTTP请求处理过程中,客户端发送请求(通常简称为req),服务器进行相应处理后返回响应(通常简称为res)。理解和应用客户端的转发与重定向机制是前端开发的重要内容。这两种机制在Web开发中具有关键作用,能够有效管理和优化用户请求的处理流程。转发机制允许服务器内部将请求传递给另一个资源,而重定向则指示客户端向新的URL发起新的请求,从而实现页面跳转或资源更新。掌握这些技术有助于提升应用的性能和用户体验。 ... [详细]
  • 在MFC框架中,存在多个全局函数,用于在不同对象间获取信息或创建新对象。其中,`afxGetApp`函数尤为关键,它能够帮助开发者轻松获取当前应用程序的实例指针。本文将详细解析`afxGetApp`函数的内部机制及其在MFC应用程序中的具体应用场景,探讨其在提升代码可维护性和灵活性方面的优势。此外,还将介绍其他常用全局函数如`AfxWinInit()`和`AfxBeginThread()`的功能和使用方法,为开发者提供全面的参考。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 本文详细介绍了 Windows API 中的按钮控件及其应用实例。主要功能包括:1. `CheckDlgButton` 用于更改对话框中按钮的选中状态;2. `CheckRadioButton` 用于设置单选按钮的选中状态。此外,还探讨了按钮控件在实际开发中的多种应用场景,帮助开发者更好地理解和使用这些功能。 ... [详细]
author-avatar
Lucifer叨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有