首页 > 编程语言 >C++学习笔记——002

C++学习笔记——002

时间:2024-03-16 16:11:46浏览次数:25  
标签:初始化 函数 int 笔记 002 static C++ 数组 指针

  • 在一个类里建立一个 const 时,不能给他初值:
class foo{
public:
    foo():i(100){}
    
private:
    const int i=100; // 错误!!!
};


//可以通过这样的方式来进行初始化
foo::foo():i(100){}

 

class Test{
public:
    Test():a(0){}
    enum {size1=100,size2=200};
    
private:
    const int a;         //只能在构造函数初始化列表中初始化
    static int b;        //在类的实现文件中定义并初始化
    const static int c;  //与 static const int c;相同
};


//static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象
int Test::b=0;


//注意:给静态成员变量赋值时,不需要加static修饰符,但要加cosnt
cosnt int Test::c=0;

 

  • 在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明: int max(int, int);

 

  • 参数的默认值:当您定义一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。请看下面的实例:
#include <iostream>


using namespace std;


int sum(int a, int b=20)
{
    int result;
    result = a + b;
    return (result);
}


int main ()
{
    // 局部变量声明
    int a = 100;
    int b = 200;
    int result;


    // 调用函数来添加值
    result = sum(a, b);
    cout << "Total value is :" << result << endl;


    // 再次调用函数
    result = sum(a);
    cout << "Total value is :" << result << endl;
    return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Total value is :300
Total value is :120

 

srand((unsigned)time(NULL));  //利用当前时钟可产生不同的随机数种子
j= rand();

 

  • 对于[]这种下标运算符,a[i]都是被解释为*(a+i)的。这是C语言中的一个规则,它把数组名和指针名视为等价的。你可以把[]看作是一种语法糖,它让你用更简洁的方式来访问数组元素,而不用写*和+。但是在编译器的眼中,它们都是一样的,它们都会被转换成指针运算。你可以用下面的公式来理解: a[i] = *(a + i) = *(i + a) = i[a] 。这里,a[i]和*(a+i)是等价的,它们都表示a加上i后所指向的地址处的值,也就是a的第i个元素。而*(i+a)和i[a]也是等价的,它们都表示i加上a后所指向的地址处的值,同样也是a的第i个元素。这里,i和a可以交换位置,因为加法运算是可交换的。你可能会觉得i[a]很奇怪,但是它确实是合法的C语言代码,只不过很少有人这么写。

 

  • C++ setw() 函数:用于设置字段的宽度,语法格式如下: setw(n) n表示宽度,用数字表示。setw() 函数只对紧接着的输出产生作用。当后面紧跟着的输出字段长度小于 n 的时候,在该字段前面用空格补齐,当输出字段长度大于 n 时,全部整体输出。

 

 

setw() 默认填充的内容为空格,可以 setfill() 配合使用设置其他字符填充。

#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    cout << setfill('*')  << setw(14) << "runoob" << endl;
    return 0;
}


//以上代码输出结果为:
//********runoob

 

  • C++ 从函数返回数组:C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:
int * myFunction()
{
    //. . .
}

 

int* myFunction()
{
   int myArray[3] = {1, 2, 3};
   return myArray;
}

注意:你不能简单地返回指向局部数组的指针,因为当函数结束时,局部数组将被销毁,指向它的指针将变得无效。

 

C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。为了避免以上情况,你可以使用静态数组或者动态分配数组。使用静态数组需要在函数内部创建一个静态数组,并将其地址返回,例如:

int* myFunction()
{
   static int myArray[3] = {1, 2, 3};
   return myArray;
}

 

  • C++ Null 指针:在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。NULL 指针是一个定义在标准库中的值为零的常量。
#include <iostream>


using namespace std;


int main ()
{
   int  *ptr = NULL;


   cout << "ptr 的值是 " << ptr ;
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

ptr 的值是 0

 

在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。

 

如需检查一个空指针,您可以使用 if 语句,如下所示:

if(ptr)       /* 如果 ptr 非空,则完成 */
if(!ptr)      /* 如果 ptr 为空,则完成 */

 

因此,如果所有未使用的指针都被赋予空值,就可以防止误用一个未初始化的指针。很多时候,未初始化的变量存有一些垃圾值,导致程序难以调试。

 

  • 使用初始化列表来初始化字段:
Line::Line( double len): length(len)
{
    cout << "Object is being created, length = " << len << endl;
}

上面的语法等同于如下语法:

Line::Line( double len)
{
    length = len;
    cout << "Object is being created, length = " << len << endl;
}

 

假设有一个类 C,具有多个字段 X、Y、Z 等需要进行初始化,同理地,您可以使用上面的语法,只需要在不同的字段使用逗号进行分隔,如下所示:

C::C( double a, double b, double c): X(a), Y(b), Z(c)
{
  ....
}

 

  • 静态成员函数与普通成员函数的区别:静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。普通成员函数有 this 指针,可以访问类中的任意成员。

 

扫码关注公众号,查看更多精彩内容

标签:初始化,函数,int,笔记,002,static,C++,数组,指针
From: https://www.cnblogs.com/bobbycheng/p/18077185

相关文章

  • C++类模板与友元详解
    C++模板下面分四种情况分别讨论。1.函数、类、类的成员函数作为类模板的友元函数、类、类的成员函数都可以作为类模板的友元。程序示例如下:void Func1() {  }class A {  };class B{public:    void Func() { }};template <class T>class Tmpl{......
  • C++类模板中的静态成员
    C++模板类模板中可以定义静态成员,从该类模板实例化得到的所有类都包含同样的静态成员。程序示例如下:#include <iostream>using namespace std;template <class T>class A{private:    static int count;public:    A() { count ++; }    ~A()......
  • C++学习笔记——001
    C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。C++是C的一个超集,事实上,任何合法的C程序都是合法的C++程序。注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。 <>......
  • P3374 【模板】树状数组 动态求连续区间和 刷题笔记
    我们创建如下的树状数组来辅助操作该数组每个s[i]处于第几层取决于其二进制最后低位的1处于从右往左数第几列显然所有奇数的最右边一位都是1即其最低位的1处于右边第一列所以所有的奇数处于第一层而2,6,10,14的最低位1处于右边第二列 所以这些数处于第二层 8的最......
  • 日期问题 刷题笔记
    思路枚举19600101到20591231这个区间的数获得年月日 判断是否合法如果合法 关于题目给出的日期有三种可能年/月/日日/月/年月/日/年判断是否和题目给出的日期符合如果符合输出闰年{1.被4整除不被100整除  2.被400整除}补位写法“%02d" 如果不足两位......
  • [算法学习笔记] 差分约束
    Description一个差分约束系统是这样的。给定一组包含\(m\)个不等式,有\(n\)个不等式形如:\[\begin{cases}x_{c_1}-x_{c'_1}\leqy_1\\x_{c_2}-x_{c'_2}\leqy_2\\\cdots\\x_{c_m}-x_{c'_m}\leqy_m\end{cases}\]求任意一组可行解。Solution观察这个式子:\(x_{c1}-......
  • C++类模板与继承详解
    C++模板类模板和类模板之间、类模板和类之间可以互相继承。它们之间的派生关系有以下四种情况。1.类模板从类模板派生示例程序:template <class T1, class T2>class A{    Tl v1; T2 v2;};template <class T1, class T2>class B : public A <T2,......
  • C++算法学习心得八.动态规划算法(3)
    1.最后一块石头的重量II(1049题)题目描述:有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x和 y,且 x<=y。那么粉碎的可能结果如下:如果 x==y,那么两块石头都会被完全粉碎;如果 x!=y,那么重量为 x 的......
  • 南京邮电大学C++实验(一)类和对象的定义及使用(仅参考)
    实验名称:类和对象的定义及使用一、实验目的和要求(1)掌握类与对象的定义与使用方法,理解面向对象方法中通过对象间传递消息的工作机制。(2)正确掌握类的不同属性成员的使用方法。(3)掌握构造函数与析构函数的概念,理解构造函数与析构函数的执行过程。(4)掌握友元函数和友元类的定义......
  • C++模板的显式实例化
    C++模板前面讲到的模板的实例化是在调用函数或者创建对象时由编译器自动完成的,不需要程序员引导,因此称为隐式实例化。相对应的,我们也可以通过代码明确地告诉编译器需要针对哪个类型进行实例化,这称为显式实例化。编译器在实例化的过程中需要知道模板的所有细节:对于函数模板,也就是......