C++學習及問題

C++學習

C++ 條件運算符 ? :

Exp1 ? Exp2 : Exp3;

其中,Exp1、Exp2 和 Exp3 是表達式。請注意冒號的使用和位置。? : 表達式的值取決于 Exp1 的計算結果。如果 Exp1 為真,則Exp1 = Exp2 計算結果。如果 Exp1 為假,則計算 Exp3 的值,且 Exp3 的計算結果則為整個 ? : 表達式的值。

? :也被稱為三元運算符

C++類

類的形式,要表明是class 然后是里面的各種東西 但是呢

class Box
{
   public:
      double length;   // Length of a box
      double breadth;  // Breadth of a box
      double height;   // Height of a box
};

關鍵字 public 確定了類成員的訪問屬性。在類對象作用域內,公共成員在類的外部是可訪問的。
私有(private)私有成員變量或函數(shù)在類的外部是不可訪問的,甚至是不可查看的。只有類和友元函數(shù)可以訪問私有成員。成員和類的默認訪問修飾符是 private。

class Box
{
   double width;
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
};

調用class的做法是:

#include <iostream>

using namespace std;

class Box
{
   public:
      double length;   // 長度
      double breadth;  // 寬度
      double height;   // 高度
};

int main( )
{
   Box Box1;       // 聲明 Box1,類型為 Box
   Box Box2;        // 聲明 Box2,類型為 Box
   double volume = 0.0;     // 用于存儲體積

   // box 1 詳述
   Box1.height = 5.0;
   Box1.length = 6.0;
   Box1.breadth = 7.0;

   // box 2 詳述
   Box2.height = 10.0;
   Box2.length = 12.0;
   Box2.breadth = 13.0;

   // box 1 的體積
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Box1 的體積:" << volume <<endl;

   // box 2 的體積
   volume = Box2.height * Box2.length * Box2.breadth;
   cout << "Box2 的體積:" << volume <<endl;
   return 0;
}

int main( )
{
Box Box1; // 聲明對象 Box1,類型為 Box
Box Box2; // 聲明對象 Box2,類型為 Box

對象的時候如此聲明。

   #include <iostream>

using namespace std;

class Box
{
   public:
      double length;         // 長度
      double breadth;        // 寬度
      double height;         // 高度

      // 成員函數(shù)聲明
      double getVolume(void);
      void setLength( double len );
      void setBreadth( double bre );
      void setHeight( double hei );
      };    // 成員函數(shù)定義

double Box::getVolume(void)
{
    return length * breadth * height;
}

void Box::setLength( double len )
{
    length = len;
}

void Box::setBreadth( double bre )
{
    breadth = bre;
}

void Box::setHeight( double hei )
{
    height = hei;
}

// 程序的主函數(shù)
int main( )
{
   Box Box1;                // 聲明 Box1,類型為 Box
   Box Box2;                // 聲明 Box2,類型為 Box
   double volume = 0.0;     // 用于存儲體積

   // box 1 詳述
   Box1.setLength(6.0);
   Box1.setBreadth(7.0);
   Box1.setHeight(5.0);

   // box 2 詳述
   Box2.setLength(12.0);
   Box2.setBreadth(13.0);
   Box2.setHeight(10.0);

   // box 1 的體積
   volume = Box1.getVolume();
   cout << "Box1 的體積:" << volume <<endl;

   // box 2 的體積
   volume = Box2.getVolume();
   cout << "Box2 的體積:" << volume <<endl;
   return 0;
}
//這個是類的基本用法,可以看出,如果沒有構造函數(shù),那么初始化的時候就非常麻煩。還要不斷調用成員函數(shù)。但是后面的構造函數(shù)就解決了參數(shù)初始化的問題,指針就解決了調用成員函數(shù)的問題

類成員函數(shù)

類的成員函數(shù)是指那些把定義和原型寫在類定義內部的函數(shù),就像類定義中的其他變量一樣。類成員函數(shù)是類的一個成員,它可以操作類的任意對象,可以訪問對象中的所有成員。

成員函數(shù)可以定義在類定義內部,或者單獨使用范圍解析運算符 :: 來定義。在類定義中定義的成員函數(shù)把函數(shù)聲明為內聯(lián)的,即便沒有使用 inline 標識符。所以您可以按照如下方式定義 Volume() 函數(shù):

class Box
{
   public:
      double length;      // 長度
      double breadth;     // 寬度
      double height;      // 高度

      double getVolume(void)
      {
         return length * breadth * height;
      }
};

也可在外面定義
您也可以在類的外部使用**范圍解析運算符 :: **定義該函數(shù),如下所示:

double Box::getVolume(void)
{
    return length * breadth * height;
}

需要強調一點,在 :: 運算符之前必須使用類名。如果調用成員函數(shù)的時候,需要用(.)運算符

Box myBox;          // 創(chuàng)建一個對象

myBox.getVolume();  // 調用該對象的成員函數(shù)

范圍解析運算符 :: 在定義成員函數(shù)的時候用

(.)符號在調用成員函數(shù)的時候用

構造函數(shù)

類的構造函數(shù)是類的一種特殊的成員函數(shù),它會在每次創(chuàng)建類的新對象時執(zhí)行。

特點:構造函數(shù)的名稱與類的名稱是完全相同的,并且不會返回任何類型,也不會返回 void。構造函數(shù)可用于為某些成員變量設置初始值。

拷貝構造函數(shù)是一種特殊的構造函數(shù),它在創(chuàng)建對象時,是使用同一類中之前創(chuàng)建的對象來初始化新創(chuàng)建的對象。拷貝構造函數(shù)通常用于

C++ 指向類的指針

int main(void)
{
   Box Box1(3.3, 1.2, 1.5);    // Declare box1 Box是一個構造函數(shù)
   Box Box2(8.5, 6.0, 2.0);    // Declare box2
   Box *ptrBox;                // Declare pointer to a class.

   // 保存第一個對象的地址
   ptrBox = &Box1;

   // 現(xiàn)在嘗試使用成員訪問運算符來訪問成員
   cout << "Volume of Box1: " << ptrBox->Volume() << endl;

   // 保存第二個對象的地址
   ptrBox = &Box2;

   // 現(xiàn)在嘗試使用成員訪問運算符來訪問成員
   cout << "Volume of Box2: " << ptrBox->Volume() << endl;

   return 0;
}

消息訂閱器和發(fā)布器

下面是一個關于subuscriber和publisher的程序


#include <ros/ros.h>
#include <turtlesim/Velocity.h>
#include <sensor_msgs/Joy.h>

class TeleopTurtle
{
public:
  TeleopTurtle();   //一個構造函數(shù)

private:
  void joyCallback(const sensor_msgs::Joy::ConstPtr& joy); //回調函數(shù)

  ros::NodeHandle nh_;

  int linear_, angular_;
  double l_scale_, a_scale_;
  ros::Publisher vel_pub_;  //在這里定義了publisher 和subscriber
  ros::Subscriber joy_sub_; //

};
// %EndTag(CLASSDEF)%
// %Tag(PARAMS)%
TeleopTurtle::TeleopTurtle(): //構造函數(shù)的定義
  linear_(1),
  angular_(2)   //這個相當于給linear賦值
{

  nh_.param("axis_linear", linear_, linear_);
  nh_.param("axis_angular", angular_, angular_);
  nh_.param("scale_angular", a_scale_, a_scale_);
  nh_.param("scale_linear", l_scale_, l_scale_);
  //nh_這個handle相當于c++中的class name,param只是這個類下面的一個對象。

  vel_pub_ = nh_.advertise<turtlesim::Velocity>("turtle1/command_velocity", 1);

  joy_sub_ = nh_.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopTurtle::joyCallback, this);

}
//定義joyCallback這個回調函數(shù)里面采用了vel_pub_這個publisher。使用的流程是這樣的,先是joy_sub_訂閱了sensor_msgs 的消息,這里面采用了回調函數(shù)joyCallback,再回調的時候,又調用了publisher vel_pub_,把速度信息發(fā)布到turtle1/command_velocity這個topic

void TeleopTurtle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy)
{
  turtlesim::Velocity vel;
  vel.angular = a_scale_*joy->axes[angular_];
  vel.linear = l_scale_*joy->axes[linear_];
  vel_pub_.publish(vel);
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "teleop_turtle");
  TeleopTurtle teleop_turtle;

  ros::spin();
}

構造函數(shù)

構造函數(shù)的名字和類完全一樣,方便賦值

帶參數(shù)的構造函數(shù)

也是和類的名字一樣

折構函數(shù)

析構函數(shù)的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作為前綴,它不會返回任何值,也不能帶有任何參數(shù)。析構函數(shù)有助于在跳出程序(比如關閉文件、釋放內存等)前釋放資源。

問題總結

  • 問:int main(int argc, char* argv[])里的(int argc, char* argv[])是什么意思?為什么要用這個?
    我的整理,argc 指的是參數(shù)的個數(shù),而argv是運行參數(shù)的字符串數(shù)組(每個char 表示程序路徑名和參數(shù))
    答1:很多程序都是帶參數(shù)運行的,比如WINDOWS命令行下的很多實用程序。參數(shù)增加了程序的靈活性。
    你可以在“開始”->“運行”中輸入cmd進入命令行。
    比如一個叫做del的命令,(刪除文件),其實就是del.exe,它帶參數(shù)的,完整的命令格式可以是
    del readme.txt
    這個命令將刪除當前路徑下的readme.txt文件(如果有的話);
    此時,運行的程序就是del.exe,而readme.txt就是它的參數(shù),
    假設del程序的main函數(shù)原型為 int main(int argc, char* argv[]),那么
    argc = 1,(1個參數(shù))
    argv[0] = “readme.txt”(接收的字符串);
    假設一個程序的main函數(shù)不帶任何參數(shù),那么很顯然,它仍可以運行,只是,不接收參數(shù)罷啦
    答2:
    void main(int argc, char* argv[ ])
    假設程序編譯成為 cp.exe
    然后在命令行中輸入
    c:>cp.exe doc1.txt doc2.txt
    這行中有三個字符串分別為 cp.exe doc1.txt doc2.txt
    則argc為3,即argc是命令行中參數(shù)的個數(shù)。
    char *argv[]為一個指像字符串的數(shù)組。
    argv[0]="cp.exe"
    argv[1]="doc1.txt"
    argv[2]="doc2.txt"
    即命令行中各各字符串保存在 *argv[]中
  • 下面兩段程序中,&的位置造成了什么不同?????

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}

bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
}
第一個程序,msg是一個指針,指向std::String的位置,前面的const是定義一個常量指針,也就是說,只能通過指針讀取信息,不能寫;第二個程序,也是指針,但是不知道區(qū)別在哪里。。。。。。

  • 類操作里面 (#)和(.)操作分別是什么意思,什么時候用?

范圍解析運算符 :: 在定義成員函數(shù)的時候用 (.)符號在調用成員函數(shù)的時候用

  • struct 里面 (.) (->) (&)分別怎么用?
    指向結構的指針
    您可以定義指向結構的指針,方式與定義指向其他類型變量的指針相似,如下所示:
    struct Books *struct_pointer;
    現(xiàn)在,您可以在上述定義的指針變量中存儲結構變量的地址。為了查找結構變量的地址,請把 & 運算符放在結構名稱的前面,如下所示:
    struct_pointer = &Book1;
    為了使用指向該結構的指針訪問結構的成員,您必須使用 -> 運算符,如下所示:
    struct_pointer->title;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 指針是C語言中廣泛使用的一種數(shù)據類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數(shù)據結構; ...
    朱森閱讀 3,615評論 3 44
  • 1.面向對象的程序設計思想是什么? 答:把數(shù)據結構和對數(shù)據結構進行操作的方法封裝形成一個個的對象。 2.什么是類?...
    少帥yangjie閱讀 5,124評論 0 14
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別? C沒有Protection行為...
    阿面a閱讀 7,893評論 0 10
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,680評論 1 51
  • 每當黎明升起,夕陽垂落 湖水茫然四顧,青山的倒影如故 而群山卻沒有懸掛湖水的影子 寂寞的是,它從不曾逃脫山的環(huán)繞
    蔣菱閱讀 223評論 1 2

友情鏈接更多精彩內容